La clause NOT IN
de SQL et les nuances des valeurs NULL
Un défi fréquent en SQL consiste à comparer des données à un ensemble de valeurs, en particulier lorsque des valeurs NULL sont présentes. Examinons cela avec quelques exemples de requêtes :
<code class="language-sql">A: SELECT 'true' WHERE 3 IN (1, 2, 3, NULL); B: SELECT 'true' WHERE 3 NOT IN (1, 2, NULL);</code>
La requête A produit un résultat, mais pas la requête B. Ce comportement découle de la façon dont SQL gère les valeurs NULL dans la clause NOT IN
.
En SQL, NULL signifie une valeur inconnue ou manquante. Son interaction avec des prédicats comme IN
et NOT IN
est régie par le paramètre ANSI_NULLS
.
Avec ANSI_NULLS
activé (valeur par défaut), les comparaisons impliquant NULL sont évaluées à INCONNU à moins d'être explicitement vérifiées à l'aide de IS NULL
ou IS NOT NULL
.
Dans la requête A, comparer 3 à une liste contenant NULL entraîne une évaluation VRAI car 3 est présent. La valeur NULL n'affecte pas le résultat global.
La requête B, cependant, utilise NOT IN
. Parce que ANSI_NULLS
est activé, la comparaison 3 NOT IN (1, 2, NULL)
est évaluée à INCONNU en raison de la comparaison entre 3 et NULL. Par conséquent, la requête renvoie un ensemble vide.
La désactivation ANSI_NULLS
modifie cela. Les valeurs NULL sont traitées comme n'importe quelle autre valeur. Dans ce scénario, 3 NOT IN (1, 2, NULL)
serait évalué à TRUE, car 3 est distinct de 1, 2 et NULL. Par conséquent, la requête B produirait un résultat avec ANSI_NULLS
désactivé.
Cela souligne l'importance du paramètre ANSI_NULLS
lors du traitement des valeurs NULL dans SQL. En gérant ce paramètre, vous contrôlez le comportement des prédicats impliquant des NULL et obtenez les résultats de requête souhaités.
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!