当我忘记两个选定列之间的逗号时,如何使 SnowFlake 引发错误?
How to make SnowFlake to raise an error when I forget comma between two selected columns?
通常,当我尝试 select SnowFlake 中的多个列时,我忘记使用逗号(而不是 a,b,c
我写 a b c
),它会给我一个错误。
输入:
select a b c from (
SELECT column1 as c, column2 as a, column3 as b
FROM (VALUES ('Q','g','a'),('C','D','x'))
);
输出:
SQL compilation error: syntax error line 1 at position 11 unexpected 'c'.
但是当我尝试仅在两列之间执行此操作时,它不会引发任何错误,而是 returns 错误的结果:
select a b from (
SELECT column1 as a, column2 as b, column3 as c
FROM (VALUES ('Q','g','a'),('C','D','x'))
);
输出:
它只显示单列,其中的值来自第 a
列,但表示它是第 b
列。我在不同的仓库,不同的 windows,使用不同的列名和值尝试了几次,但它仍然是一样的。
这种行为的原因是什么?为什么它不像在 3 列的情况下那样引发错误消息?我发现这种行为非常令人困惑。 我能否以某种方式告诉 SF 引发错误(就像 3 列或更多列的情况一样)?
这是有效的 SQL,实际上。您正在做的是 SELECT
ing 列 a,但在最终 select 中为其添加别名 'b'。别名的 'as' 在 SQL 中是可选的。
请注意,这就是为什么当您列出 3 列时,您会在 'c' 而不是 'b' 上收到错误。因为即使在该查询中,'a as b' 等效项也是有效的。
最好的做法是使用前缀和 AS
关键字。乍一看似乎是多余的,但 "显式优于隐式".
例如,当列有前缀时,这种“打字错误”会立即出错:
select s.a s.b from (
SELECT column1 as c, column2 as a, column3 as b
FROM (VALUES ('Q','g','a'),('C','D','x'))
) AS s;
-- Syntax error: unexpected '.'. (line 1)
理想情况是使用AS
关键字:
SELECT s.a, s.b, s.c
FROM(
SELECT column1 as c, column2 as a, column3 as b
FROM (VALUES ('Q','g','a'),('C','D','x'))
) AS s;
整个查询可以进一步简化:
SELECT s.a, s.b, s.c
FROM (VALUES ('Q','g','a'),('C','D','x')) AS s(a,b,c);
额外内容:
下面的查询可以被视为 code smell。
SELECT col1 col2
FROM tab;
有一些工具能够检测到此类事件。例如:SQLFluff
Rules in SQLFluff are implemented as crawlers. These are entities which work their way through the parsed structure of a query to evaluate a particular rule or set of rules.
...
class Rule_L012(code, description, **kwargs)
Implicit aliasing of column not allowed. Use explicit AS clause.
NB: This rule inherits its functionality from obj:Rule_L011 but is separate so that they can be enabled and disabled separately.
通常,当我尝试 select SnowFlake 中的多个列时,我忘记使用逗号(而不是 a,b,c
我写 a b c
),它会给我一个错误。
输入:
select a b c from (
SELECT column1 as c, column2 as a, column3 as b
FROM (VALUES ('Q','g','a'),('C','D','x'))
);
输出:
SQL compilation error: syntax error line 1 at position 11 unexpected 'c'.
但是当我尝试仅在两列之间执行此操作时,它不会引发任何错误,而是 returns 错误的结果:
select a b from (
SELECT column1 as a, column2 as b, column3 as c
FROM (VALUES ('Q','g','a'),('C','D','x'))
);
输出:
它只显示单列,其中的值来自第 a
列,但表示它是第 b
列。我在不同的仓库,不同的 windows,使用不同的列名和值尝试了几次,但它仍然是一样的。
这种行为的原因是什么?为什么它不像在 3 列的情况下那样引发错误消息?我发现这种行为非常令人困惑。 我能否以某种方式告诉 SF 引发错误(就像 3 列或更多列的情况一样)?
这是有效的 SQL,实际上。您正在做的是 SELECT
ing 列 a,但在最终 select 中为其添加别名 'b'。别名的 'as' 在 SQL 中是可选的。
请注意,这就是为什么当您列出 3 列时,您会在 'c' 而不是 'b' 上收到错误。因为即使在该查询中,'a as b' 等效项也是有效的。
最好的做法是使用前缀和 AS
关键字。乍一看似乎是多余的,但 "显式优于隐式".
例如,当列有前缀时,这种“打字错误”会立即出错:
select s.a s.b from (
SELECT column1 as c, column2 as a, column3 as b
FROM (VALUES ('Q','g','a'),('C','D','x'))
) AS s;
-- Syntax error: unexpected '.'. (line 1)
理想情况是使用AS
关键字:
SELECT s.a, s.b, s.c
FROM(
SELECT column1 as c, column2 as a, column3 as b
FROM (VALUES ('Q','g','a'),('C','D','x'))
) AS s;
整个查询可以进一步简化:
SELECT s.a, s.b, s.c
FROM (VALUES ('Q','g','a'),('C','D','x')) AS s(a,b,c);
额外内容:
下面的查询可以被视为 code smell。
SELECT col1 col2
FROM tab;
有一些工具能够检测到此类事件。例如:SQLFluff
Rules in SQLFluff are implemented as crawlers. These are entities which work their way through the parsed structure of a query to evaluate a particular rule or set of rules.
...
class Rule_L012(code, description, **kwargs)
Implicit aliasing of column not allowed. Use explicit AS clause.
NB: This rule inherits its functionality from obj:Rule_L011 but is separate so that they can be enabled and disabled separately.