无法选择作为 SQL 关键字的列名

Posted

技术标签:

【中文标题】无法选择作为 SQL 关键字的列名【英文标题】:Can't select column name that is a SQL keyword 【发布时间】:2021-08-14 11:47:00 【问题描述】:

无论出于何种原因,数据库中有一个名为order 的列。我无法在 Snowflake 的查询中选择它。以下都是由于

SQL 编译错误:位置 9 的第 1 行语法错误意外“顺序”。

// Obviously, this fails.
select order
from example_table

// Also fails
select a.order
from example_table as a

// Identifier doesn't exist.
select "order"
from example_table

我不知道应该如何选择此列。我无法更改底层数据库表中列的命名。

【问题讨论】:

你能试试这里列出的一些选项吗:***.com/questions/2901453/… @ImAtWar 这些都失败了。具体来说,只有“订单”关键字会触发此操作。有多种命名不佳的列,例如“index”,但执行 a.index 之类的操作可以正常工作。我在 Snowflake 之外没有遇到过这个问题,这就是为什么这个问题被标记为 Snowflake。 【参考方案1】:

它在两种情况下都按预期工作:

CREATE OR REPLACE TABLE example_table("order" INT);
INSERT INTO example_table VALUES (1),(2);

SELECT "order" FROM  example_table;
-- 1
-- 2

SELECT e."order" FROM  example_table e;
-- 1
-- 2

很可能使用了不可见字符或名称不是问题所述的小写字母。使用 " 引用标识符时,它必须是 1:1,因为它是创建的。

Identifier Requirements

如果您在标识符周围加上双引号(例如“我的标识符带有空格和标点符号。”),则适用以下规则:

在存储和解析标识符时保留标识符的大小写(例如“id”被存储和解析为id)。

CREATE OR REPLACE TABLE example_table("Order" INT);
INSERT INTO example_table VALUES (1),(2);

SELECT "order" FROM  example_table;
-- Error: invalid identifier '"order"' (line 17)

SELECT "Order" FROM  example_table;
-- 1
-- 2 

“实际”列名可以使用下述方法之一找到:

DESCRIBE TABLE example_table;
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ILIKE 'example_table';

SELECT GET_DDL('table', 'public.example_table');
-- create or replace TABLE EXAMPLE_TABLE ( "Order" NUMBER(38,0) );

【讨论】:

啊,难以置信,睡眠不足让我上了那个哈哈。没错,当迁移到 Snowflake 时,所有列都是全大写的。我正在阅读生产表而不是雪花中的那些。因此使用双引号的问题。谢谢!

以上是关于无法选择作为 SQL 关键字的列名的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL Server 存储过程中查找表名的列名作为保留关键字

如何处理看起来像 SQL 关键字的 SQL 列名?

mysql - 使用关键字作为列名时出现错误 1064 (42000)

PostgreSQL 列名作为两个表中的关键字

作为关键字 SQL VBA

第2课 检索数据