2016-12-07 6 views
2

Хорошо, у меня есть следующий код, чтобы отметить записи, которые имеют высокий 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 

Делает для меня нулевой смысл, и кажется слишком очевидным, чтобы быть ошибкой в ​​механизме выполнения. Что мне не хватает?

ответ

5

Существует все о концепции 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 

Смотрите это для справки: https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29