表别名:带引号的列标识符的名称解析变更¶
在 SELECT 语句的 FROM 子句中,可以使用 AS 子句来定义表及其列的别名。例如:
SELECT * FROM my_table AS my_table_alias(my_column_1_alias, my_column_2_alias);
此公告描述了表别名中带引号列标识符的解析方式变更:
- 变更前:
如果在表别名中的列标识符两侧使用双引号,则双引号将成为列别名的一部分。
例如,以下查询定义表别名 (table_alias) 和包含引号的列别名 ("column_alias"):
SELECT * FROM table_1 AS my_table_alias("my_column_alias");
在输出中,第一列的名称包含引号 (
"my_column_alias"
)。由于引号当前是列别名的一部分,因此如果需要引用此列别名,则必须包含引号。例如,如果要引用所选列的列表中的列别名,则必须在列别名中包含引号:
SELECT """my_column_alias""" FROM table_1 AS my_table_alias("my_column_alias");
请注意,在上面的示例中,列别名放在引号内,并且列别名中的引号是用两个双引号字符指定的。
- 变更后:
如果在表别名中的列标识符两侧使用双引号,则双引号不会用作列别名的一部分。
SELECT * FROM table_1 AS my_table_alias("my_column_alias");
在输出中,第一列的名称不包含引号 (
my_column_alias
)。在列别名中使用引号的查询会失败,并出现“invalid identifier”错误:
SELECT """my_column_alias""" FROM table_1 AS my_table_alias("my_column_alias");
如果对表别名中的列使用带双引号的标识符,请使用以下方法之一来修正 SQL 语句:
如果需要保持列名不变(保留引号和区分大小写),请重写现有查询,以使用公用表表达式来定义列别名。
例如,将:
SELECT """My_Column_Alias""" FROM table_1 AS my_table_alias("My_Column_Alias")
更改为:
WITH my_table_alias("""My_Column_Alias""") AS (SELECT * FROM table_1) SELECT """My_Column_Alias""" FROM my_table_alias
如果可以更改现有查询的输出列名,请考虑从列别名定义中移除引号。
例如,将:
SELECT """my_column_alias""" FROM table_1 AS my_table_alias("my_column_alias");
更改为:
SELECT my_column_alias FROM table_1 AS my_table_alias(my_column_alias);
请注意,此语句创建
my_column_alias
标识符,并将其解析为不带任何引号的大写字符。如果使用此方法,则可能需要调整引用了此列别名的代码或语句。例如,客户端应用程序不会使用
"my_column_alias"
来访问上面的列,而是可能需要将其作为MY_COLUMN_ALIAS
来引用。
参考:881