当我忘记两个选定列之间的逗号时,如何使 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,实际上。您正在做的是 SELECTing 列 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.