好的,我有以下代码来用二进制标志标记表中具有最高 Month_cd 的记录:
Select t1.month_cd, t2.max_month_cd
,CASE WHEN t2.max_month_cd != null then 0 else 1 end test_1
,CASE WHEN t2.max_month_cd = null then 0 else 1 end test_2
from source t1
Left join (
Select
MAX(month_cd) as max_month_cd
From source
) t2
on t1.month_cd = t2.max_month_cd;
对我来说这似乎很简单,但它返回的结果是:
month_cd max_month_cd test_1 test_2
201610 null 1 1
201611 201611 1 1
对我来说毫无意义,而且似乎太明显了,不可能是执行引擎中的错误。我缺少什么?
这都是关于 NULL 概念的。
由于 Null 不是任何数据域的成员,因此它不被视为“值”,而是指示不存在值的标记。因此,与 Null 的比较永远不会产生 True 或 False,但总是产生第三个逻辑结果,Unknown。 NULL 代表什么都没有,没有对象。因此,没有什么不能等于 NULL 或其他值。 SQL中有IS NULL
and IS NOT NULL
用于测试空值的条件。
在您的 CASE 中,逻辑表达式的结果未知,因此分配了 ELSE 值。
更正版本:
CASE WHEN t2.max_month_cd IS NOT null then 0 else 1 end test_1,
CASE WHEN t2.max_month_cd IS null then 0 else 1 end test_2
请参阅此以供参考:空(SQL) https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)