我试图确定为什么我使用分配给列的别名执行的简单 SQL
select
语句返回数据,但使用原始列名而不是我分配的别名。
我在 Oracle SQL Developer 中使用通过 MySQL JDBC 驱动程序连接的 MariaDB 数据库执行 SQL 语句时遇到了这种情况。
参考版本:
示例 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');
当我运行 SQL 语句时,例如:
select name, phone_number, num0, state_location from employee;
结果输出为:
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.
使用像这样的一些别名更新此语句,我得到与上面完全相同的结果。
select name, phone_number, num0 as age, state_location as state_abbreviation from employee;
我希望按照典型方式修改列名(或者如果语法被此数据库配置拒绝,至少会出现错误)。
像这样:
name phone_number age state_abbr
-------------------- ------------ ------------------- ----------
如果我在应用别名之前对列应用某些函数或操作,则将显示别名。
修改示例:
SELECT name, phone_number, cast(num0 as int) as age, CAST(state_location AS VARCHAR(2)) AS state_abbr FROM employee;
结果:
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.
注意:我尝试使用以下样式定义列别名并得到相同的结果。
num0 as age
num0 "age"
num0 as "age"
num0 `age`
num0 as `age`
如果我转到命令行并直接连接到 MariaDB 并运行第一次别名尝试(即 num0 作为年龄)。 它确实成功打印了具有正确别名的值。
Oracle SQL Dev、mysql JDBC 和底层 MariaDB 之间的环境配置存在一些问题,导致了这种意外行为(至少对我来说是意外的)。
是的,你是对的,问题与通过
Oracle SQL Developer
驱动程序连接的 MySQL JDBC
有关。由于驱动程序功能和显示设置存在一些差异,与非 Oracle 数据库一起使用时,Oracle SQL Developer
无法正确解释结果,因此,由于 Oracle SQL Developer
与 MySQL JDBC 驱动程序的交互方式,列别名等元数据可能无法正确刷新。