2016-12-07 4 views
2

Ok, ich habe einen folgenden Code Datensätze zu markieren, die höchste month_cd in Tabl mit Binärmerker haben:CASE-Anweisungen in Hive

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; 

Es mir gerade nach vorne scheint, aber führen sie zurückkehren ist:

month_cd max_month_cd test_1 test_2 
201610 null   1  1 
201611 201611  1  1 

Macht null Sinn für mich, und scheint zu offensichtlich zu sein, um ein Fehler in der Ausführungsengine zu sein. Was vermisse ich?

Antwort

5

Es gibt alles über NULL-Konzept. Da Null kein Mitglied einer Datendomäne ist, wird es nicht als "Wert" betrachtet, sondern als Markierung (oder Platzhalter), die angibt, dass kein Wert vorhanden ist. Aus diesem Grund können Vergleiche mit Null niemals zu True oder False führen, sondern immer zu einem dritten logischen Ergebnis, Unknown. NULL ist nichts, Abwesenheit von Objekt. Also kann nichts NICHT gleich NULL oder etwas anderes sein. In SQL sind IS NULL und IS NOT NULL Bedingungen für den Test für Nullwerte verwendet werden. In Ihrem Fall ist das Ergebnis des logischen Ausdrucks unbekannt, daher wird ELSE-Wert zugewiesen.

Korrigierte Version:

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 

Sehen Sie diese als Referenz: https://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29