表别名:带引号的列标识符的名称解析变更

注意

此行为变更在 2023_07 捆绑包中。

有关捆绑包的当前状态,请参阅 捆绑包历史记录

SELECT 语句的 FROM 子句中,可以使用 AS 子句来定义表及其列的别名。例如:

SELECT * FROM my_table AS my_table_alias(my_column_1_alias, my_column_2_alias);
Copy

此公告描述了表别名中带引号列标识符的解析方式变更:

变更前:

如果在表别名中的列标识符两侧使用双引号,则双引号将成为列别名的一部分。

例如,以下查询定义表别名 (table_alias) 和包含引号的列别名 ("column_alias"):

SELECT * FROM table_1 AS my_table_alias("my_column_alias");
Copy

在输出中,第一列的名称包含引号 ("my_column_alias")。

由于引号当前是列别名的一部分,因此如果需要引用此列别名,则必须包含引号。例如,如果要引用所选列的列表中的列别名,则必须在列别名中包含引号:

SELECT """my_column_alias""" FROM table_1 AS my_table_alias("my_column_alias");
Copy

请注意,在上面的示例中,列别名放在引号内,并且列别名中的引号是用两个双引号字符指定的。

变更后:

如果在表别名中的列标识符两侧使用双引号,则双引号不会用作列别名的一部分。

SELECT * FROM table_1 AS my_table_alias("my_column_alias");
Copy

在输出中,第一列的名称不包含引号 (my_column_alias)。

在列别名中使用引号的查询会失败,并出现“invalid identifier”错误:

SELECT """my_column_alias""" FROM table_1 AS my_table_alias("my_column_alias");
Copy

如果对表别名中的列使用带双引号的标识符,请使用以下方法之一来修正 SQL 语句:

  • 如果需要保持列名不变(保留引号和区分大小写),请重写现有查询,以使用公用表表达式来定义列别名。

    例如,将:

    SELECT """My_Column_Alias"""
      FROM table_1 AS my_table_alias("My_Column_Alias")
    
    Copy

    更改为:

    WITH my_table_alias("""My_Column_Alias""")
        AS (SELECT * FROM table_1)
      SELECT """My_Column_Alias""" FROM my_table_alias
    
    Copy
  • 如果可以更改现有查询的输出列名,请考虑从列别名定义中移除引号。

    例如,将:

    SELECT """my_column_alias"""
      FROM table_1 AS my_table_alias("my_column_alias");
    
    Copy

    更改为:

    SELECT my_column_alias
      FROM table_1 AS my_table_alias(my_column_alias);
    
    Copy

    请注意,此语句创建 my_column_alias 标识符,并将其解析为不带任何引号的大写字符。如果使用此方法,则可能需要调整引用了此列别名的代码或语句。

    例如,客户端应用程序不会使用 "my_column_alias" 来访问上面的列,而是可能需要将其作为 MY_COLUMN_ALIAS 来引用。

参考:881

语言: 中文