web-dev-qa-db-fra.com

Instructions CASE dans Hive

Ok, j'ai un code suivant pour marquer les enregistrements qui ont le mois_cd le plus élevé en tabl avec le drapeau binaire:

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;

Cela me semble simple, mais le résultat est:

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

Cela n'a aucun sens pour moi et semble trop évident pour être un bogue dans le moteur d'exécution. Qu'est-ce que je rate?

5
JagdCrab

Il s'agit du concept NULL.

Étant donné que Null n'est membre d'aucun domaine de données, il n'est pas considéré comme une "valeur", mais plutôt comme un marqueur (ou un espace réservé) indiquant l'absence de valeur. Pour cette raison, les comparaisons avec Null ne peuvent jamais aboutir à True ou False, mais toujours à un troisième résultat logique, Unknown. NULL n'est rien, absence d'objet. Donc, rien ne peut être égal à NULL ou autre chose. En SQL, il y a IS NULL et IS NOT NULL conditions à utiliser pour tester les valeurs nulles.

Dans votre CASE, le résultat de l'expression logique est inconnu, donc la valeur ELSE est affectée.

Version corrigée:

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

Voir ceci pour référence: Null (SQL)

11
leftjoin