Estou tentando determinar por que uma select
instrução SQL simples que executei com um alias atribuído a uma coluna está retornando dados, mas com o nome da coluna original e não o alias que atribuí.
Estou enfrentando isso ao executar instruções SQL no Oracle SQL Developer com um banco de dados MariaDB conectado por meio de um driver MySQL JDBC.
Versões para referência:
- Desenvolvedor Oracle SQL 23.1.1.345.2114
- Plataforma Java(TM) 11.0.21.0.2
- MySQL JDBC 9.0.0
- MariaDB 11.4.2
Exemplo de tabela/dados SQL:
-- Create the schema
CREATE SCHEMA example;
-- Use the schema
USE example;
-- Create the employee table
CREATE TABLE example.employee (
name VARCHAR(20),
phone_number CHAR(10),
num0 INT,
state_location CHAR(2)
);
-- Insert statements for 10 employees
INSERT INTO employee (name, phone_number, num0, state_location) VALUES
('Alice', '1234567890', 30, 'TX'),
('Bob', '2345678901', 25, 'CA'),
('Charlie', '3456789012', 28, 'NY'),
('David', '4567890123', 35, 'FL'),
('Eve', '5678901234', 22, 'WA'),
('Frank', '6789012345', 40, 'IL'),
('Grace', '7890123456', 27, 'GA'),
('Hank', '8901234567', 33, 'NV'),
('Ivy', '9012345678', 29, 'OR'),
('Jack', '0123456789', 31, 'AZ');
Quando executo uma instrução SQL como:
select name, phone_number, num0, state_location from employee;
A saída resultante é:
name phone_number num0 state_location
-------------------- ------------ ---------- --------------
Alice 1234567890 30 TX
Bob 2345678901 25 CA
Charlie 3456789012 28 NY
David 4567890123 35 FL
Eve 5678901234 22 WA
Frank 6789012345 40 IL
Grace 7890123456 27 GA
Hank 8901234567 33 NV
Ivy 9012345678 29 OR
Jack 0123456789 31 AZ
10 rows selected.
Atualizando esta declaração com alguns aliases como este, obtenho exatamente o mesmo resultado acima:
select name, phone_number, num0 as age, state_location as state_abbreviation from employee;
Espero que os nomes das colunas sejam modificados como é típico (ou pelo menos um erro se a sintaxe for rejeitada por esta configuração de banco de dados).
Assim:
name phone_number age state_abbr
-------------------- ------------ ------------------- ----------
Se eu aplicar alguma função ou manipulação a uma coluna antes de aplicar um alias, o alias será exibido.
Exemplo de modificação:
SELECT name, phone_number, cast(num0 as int) as age, CAST(state_location AS VARCHAR(2)) AS state_abbr FROM employee;
Resultado:
name phone_number age state_abbr
-------------------- ------------ ------------------- ----------
Alice 1234567890 30 TX
Bob 2345678901 25 CA
Charlie 3456789012 28 NY
David 4567890123 35 FL
Eve 5678901234 22 WA
Frank 6789012345 40 IL
Grace 7890123456 27 GA
Hank 8901234567 33 NV
Ivy 9012345678 29 OR
Jack 0123456789 31 AZ
10 rows selected.
Nota: Tentei definir o alias da coluna com os seguintes estilos e obtive os mesmos resultados:
num0 as age
num0 "age"
num0 as "age"
num0 `age`
num0 as `age`
Se eu for para minha linha de comando e conectar-me diretamente ao MariaDB e executar a primeira tentativa de alias (ou seja, num0 como idade), ele imprimirá com sucesso o valor com o nome de alias correto.
Há algo nessa configuração de ambiente entre o Oracle SQL Dev, o MySQL JDBC e o MariaDB que está resultando nesse comportamento inesperado (pelo menos inesperado para mim).
Sim, você está certo, o problema está relacionado ao
Oracle SQL Developer
usoMySQL JDBC
do driver.Oracle SQL Developer
O nem sempre interpreta os resultados com precisão quando conectado a bancos de dados que não são Oracle devido a diferenças nos recursos do driver e nas configurações de exibição. Portanto, metadados como aliases de coluna podem não ser atualizados corretamente devido à forma comoOracle SQL Developer
interage com oMySQL JDBC
driver.Mudar para
MariaDB Connector/J
também não resolverá esse problema. Acho que a melhor solução alternativa é usar uma ferramenta de gerenciamento de banco de dados alternativa projetada especificamente para MySQL/MariaDB, como MySQL Workbench , DBeaver ou um MariaDB CLI nativo . Essas ferramentas geralmente oferecem melhor compatibilidade com os metadados do MariaDB e manipulam aliases de coluna e outros recursos corretamente.