Maison > base de données > tutoriel mysql > Pourquoi « NOT IN » renvoie-t-il des résultats inattendus avec des valeurs NULL dans SQL ?

Pourquoi « NOT IN » renvoie-t-il des résultats inattendus avec des valeurs NULL dans SQL ?

Susan Sarandon
Libérer: 2025-01-23 12:36:12
original
827 Les gens l'ont consulté

Why Does `NOT IN` Return Unexpected Results with NULL Values in SQL?

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>
Copier après la connexion

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal