我试图确定为什么select
我执行的一个带有分配给列的别名的简单 SQL 语句返回数据但带有原始列名而不是我分配的别名。
我在通过 MySQL JDBC 驱动程序连接的 MariaDB 数据库在 Oracle SQL Developer 中执行 SQL 语句时遇到了这种情况。
参考版本:
- Oracle SQL 开发人员 23.1.1.345.2114
- Java(TM) 平台 11.0.21.0.2
- MySQL JDBC 9.0.0
- MariaDB 11.4.2
示例 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 作为 age),它会成功打印具有正确别名的值。
Oracle SQL Dev、MySQL JDBC 和底层 MariaDB 之间的环境配置存在一些问题,导致了这种意外行为(至少对我来说是意外的)。