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?
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)