J'avais une requête (pour Postgres et Informix) avec une NOT IN
clause contenant une sous-requête qui, dans certains cas, renvoyait des NULL
valeurs, ce qui faisait que cette clause (et la requête entière) ne retournait rien.
Quelle est la meilleure façon de comprendre cela? Je pensais NULL
à quelque chose sans valeur, et je ne m'attendais donc pas à ce que la requête échoue, mais ce n'est évidemment pas la bonne façon de penser NULL
.
la source
x <> NULL
comme résolvant àFALSE
, vous vous attendezNOT (x <> NULL)
à évaluerTRUE
et ce n'est pas le cas. Les deux évaluentUNKNOWN
. L'astuce est qu'une ligne n'est sélectionnée que si laWHERE
clause (si présente) est évaluée àTRUE
- une ligne est omise si la clause est évaluée àFALSE
ouUNKNOWN
. Ce comportement (en général, et pour leNOT IN
prédicat en particulier) est rendu obligatoire par la norme SQL.NULL NOT IN (some_subquery)
ne devrait pas retourner la ligne extérieure , sauf sisome_subquery
ne renvoie pas de lignes. C'est pourquoi le plan d'exécution lorsque les deux colonnes sont Null-able peut être considérablement plus cher. Exemple SQL Server