无法选择作为 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 存储过程中查找表名的列名作为保留关键字