微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CASE 语句未正确定义列

如何解决CASE 语句未正确定义列

我有以下格式的查询,用于执行 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 时,我们需要将 UnkNown 的值设为 Proxy_Type。但是当我们运行查询时,我们得到了意想不到的输出。请看截图。

enter image description here

请就如何修复它提出建议。

解决方法

似乎“内联/横向列别名”不允许在同一级别“覆盖”列:

client = boto3.client('cloudwatch')

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

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

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

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

理想的情况是,如果我们有额外的关键字来区分原始列和计算表达式,比如 https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudwatch.html

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
,

我猜你想在你的 case 语句中使用重新定义的 mm1/mm2 值?如果是这样,那么 SQL 就不会那样工作,值不会在同一个 select 语句中更改,因此 m1/m2 将在 select 语句中引用它们的任何地方使用它们的起始值。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。