好的,我有一个以下代码来标记具有二进制标志的tabl中具有最高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
对我来说没有任何意义,并且似乎太明显不能成为执行引擎中的错误。我错过了什么?
答案 0 :(得分:6)
这是关于NULL概念的全部内容。
由于Null不是任何数据域的成员,因此它不被视为"值",而是表示缺少值的标记(或占位符)。因此,与Null的比较永远不会导致True或False,但总是在第三个逻辑结果Unknown中。 NULL没什么,没有对象。所以,没有什么不能等于NULL或其他东西。在SQL中,有IS NULL
和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
请参阅此参考:Null (SQL)