2016-12-07 174 views
2

好吧,我有一个下面的代码来标记具有最高month_cd与二进制标志TABL记录:CASE语句

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 

对我来说意义不大,似乎太明显,不能成为执行引擎中的错误。我错过了什么?

回答

5

有关于NULL概念的全部内容。由于Null不是任何数据域的成员,因此它不被视为“值”,而是指示缺少价值的标记(或占位符)。因此,与Null进行比较永远不会导致True或False,但总是会出现在第三个逻辑结果Unknown中。 NULL不是什么,没有对象。所以,没有什么不能等于NULL或其他东西。在SQL中,有IS NULLIS 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 

参考见本:https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29