2016-12-07 5 views
2

좋아, 내가 진 플래그 TABL에서 가장 높은 month_cd이 기록을 표시하는 다음 코드가 : 그것은 나에게 앞으로 똑바로 보인다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