CASE 语句未正确定义列雪花

CASE statement not Defining a Column Correctly Snowflake

我有以下格式的查询,用于执行 COALESCE 以及使用 CASE 语句定义新列。

SELECT ....
       COALESCE(mm1,'missing') AS mm1,
       COALESCE(mm2,'missing') AS mm2,

    CASE WHEN mm1='false' AND mm2='false' THEN 'No-Proxy'
         WHEN mm1 IN ('false','missing') AND mm2='true' THEN 'Good-Proxy'
         WHEN mm1 ='true' AND mm2 IN ('false','missing') THEN 'Bad-Proxy'
         WHEN ((mm1='true' AND mm2='true') OR (mm1='missing' AND mm2='missing')
              OR (mm1='false' AND mm2='missing') OR (mm1='missing' AND mm2='false')) THEN 'Unknown'
         END AS Proxy_Type,

如上所示,当mm1mm2原本都是NULL时,我们需要将Proxy_Type的值设为Unknown。但是当我们 运行 查询时,我们得到了意想不到的输出。请看截图。

请告知如何修复它。

我猜你正试图在你的 case 语句中使用 mm1/mm2 的重新定义值?如果是这样,那么 SQL 不会像那样工作,值不会在同一个 select 语句中改变,所以 m1/m2 将在 [=17= 中引用的任何地方都有它们的起始值]声明。

解决这个问题的一种方法是使用这样的东西:

COALESCE(mm1,'missing') AS mm1,
COALESCE(mm2,'missing') AS mm2,

CASE WHEN COALESCE(mm1,'missing') ='false' …

似乎“inline/lateral 列别名”不允许在同一级别“覆盖”列:

CREATE OR REPLACE TABLE t
AS SELECT NULL AS mm1, NULL AS mm2;

选项 1:使用不同的列别名

SELECT 
       COALESCE(mm1,'missing') AS mm1_,
       COALESCE(mm2,'missing') AS mm2_,

    CASE WHEN mm1_='false' AND mm2_='false' THEN 'No-Proxy'
         WHEN mm1_ IN ('false','missing') AND mm2_='true' THEN 'Good-Proxy'
         WHEN mm1_ ='true' AND mm2_ IN ('false','missing') THEN 'Bad-Proxy'
         WHEN ((mm1_='true' AND mm2_='true') OR (mm1_='missing' AND mm2_='missing')
              OR (mm1_='false' AND mm2_='missing') 
              OR (mm1_='missing' AND mm2_='false')) THEN 'Unknown'
         END AS Proxy_Type
FROM t;
-- MM1_ MM2_    PROXY_TYPE
--missing   missing Unknown

选项 2:LATERAL JOIN 并使用子查询别名作为前缀:

SELECT -- t.mm1, t.mm2,
    s.mm1, s.mm2,
    CASE WHEN s.mm1='false' AND s.mm2='false' THEN 'No-Proxy'
         WHEN s.mm1 IN ('false','missing') AND s.mm2='true' THEN 'Good-Proxy'
         WHEN s.mm1 ='true' AND s.mm2 IN ('false','missing') THEN 'Bad-Proxy'
         WHEN ((s.mm1='true' AND s.mm2='true') OR (s.mm1='missing' AND s.mm2='missing')
              OR (s.mm1='false' AND s.mm2='missing') 
              OR (s.mm1='missing' AND s.mm2='false')) THEN 'Unknown'
         END AS Proxy_Type
FROM t,
LATERAL(SELECT COALESCE(t.mm1,'missing') AS mm1,COALESCE(t.mm2,'missing') AS mm2) s;
-- MM1  MM2 PROXY_TYPE
--missing   missing Unknown

理想的情况是,如果我们有额外的关键字来区分原始列和计算表达式,类似于 SAS - calculated

SELECT 
     col, 
     col+10 AS col, 
     col,
     calculated col
FROM t;
-- output
t.col/expression/t.col/expression