Comprendre le comportement inattendu des valeurs NULL et la clause NOT IN
en SQL
Les requêtes SQL produisent souvent des résultats surprenants lorsque les valeurs NULL
interagissent avec l'opérateur NOT IN
. Cet écart devient évident lorsque l'on compare une requête NOT IN
à une requête équivalente utilisant un LEFT JOIN
.
Considérez ces requêtes :
A: select 'true' where 3 in (1, 2, 3, null) B: select 'true' where 3 not in (1, 2, null)
La requête A renvoie un résultat, contrairement à la requête B. La cause première réside dans la manière dont les différentes bases de données SQL gèrent les NULL
valeurs.
Avec ANSI_NULLS
activé (valeur par défaut dans de nombreux systèmes comme SQL Server 2005), toute comparaison impliquant NULL
, telle que 3 = NULL
, est évaluée à UNKNOWN
. Cette indétermination découle de l'incertitude inhérente à NULL
.
Dans la requête B, l'opérateur NOT IN
rencontre NULL
dans la sous-requête, ce qui entraîne une évaluation UNKNOWN
. Puisqu'aucune autre valeur ne correspond, le prédicat entier devient UNKNOWN
, donnant un ensemble de résultats vide.
À l'inverse, la désactivation ANSI_NULLS
modifie le comportement. Avec ANSI_NULLS
désactivé, 3 = NULL
est évalué à TRUE
. SQL interprète NULL
comme potentiellement égal à tout, y compris lui-même. Par conséquent, le prédicat de la requête B est évalué à TRUE
, renvoyant un résultat.
En bref, les résultats incohérents proviennent du traitement variable des valeurs NULL
déterminées par le paramètre ANSI_NULLS
. Lorsque ANSI_NULLS
est activé, les comparaisons avec NULL
produisent UNKNOWN
, conduisant à des résultats inattendus dans les requêtes utilisant les valeurs NOT IN
et NULL
. Cela souligne l'importance de comprendre la NULL
gestion en SQL pour des résultats de requête précis.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!