【问题标题】:Can't select column name that is a SQL keyword无法选择作为 SQL 关键字的列名
【发布时间】: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

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

【问题讨论】:

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

标签: snowflake-cloud-data-platform


【解决方案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 时,所有列都是全大写的。我正在阅读生产表而不是雪花中的那些。因此使用双引号的问题。谢谢!
猜你喜欢
  • 2020-05-27
  • 2021-09-17
  • 2023-03-28
  • 2015-02-03
  • 2010-11-18
  • 1970-01-01
  • 2015-05-27
  • 2014-04-15
  • 1970-01-01
相关资源
最近更新 更多