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

zoj*_*wek 2 snowflake-cloud-data-platform

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

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

// 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
Run Code Online (Sandbox Code Playgroud)

我不知道如何选择此专栏。我无法更改基础数据库表中列的命名。

Luk*_*zda 5

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

\n
CREATE OR REPLACE TABLE example_table("order" INT);\nINSERT INTO example_table VALUES (1),(2);\n\nSELECT "order" FROM  example_table;\n-- 1\n-- 2\n\nSELECT e."order" FROM  example_table e;\n-- 1\n-- 2\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
\n

标识符要求

\n

如果将标识符放在双引号内(例如 \xe2\x80\x9cMy 带有空格和标点符号的标识符。\xe2\x80\x9d),则适用以下规则:

\n

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

\n
\n
CREATE OR REPLACE TABLE example_table("Order" INT);\nINSERT INTO example_table VALUES (1),(2);\n\nSELECT "order" FROM  example_table;\n-- Error: invalid identifier \'"order"\' (line 17)\n\nSELECT "Order" FROM  example_table;\n-- 1\n-- 2 \n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
DESCRIBE TABLE example_table;\nSELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ILIKE \'example_table\';\n\nSELECT GET_DDL(\'table\', \'public.example_table\');\n-- create or replace TABLE EXAMPLE_TABLE ( "Order" NUMBER(38,0) );\n
Run Code Online (Sandbox Code Playgroud)\n