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
Susan Sarandonoriginal
2025-01-23 12:36:12861parcourir

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>

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:
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