Maison > base de données > tutoriel mysql > Pourquoi ma clause SQL `NOT IN` ne fonctionne-t-elle pas avec des valeurs NULL ?

Pourquoi ma clause SQL `NOT IN` ne fonctionne-t-elle pas avec des valeurs NULL ?

Susan Sarandon
Libérer: 2025-01-18 11:21:09
original
432 Les gens l'ont consulté

Why Doesn't My SQL `NOT IN` Clause Work with NULL Values?

Dépannage de la clause NOT IN et des valeurs NULL de SQL

Cet article traite d'un problème courant rencontré lors de l'utilisation de la clause NOT IN dans les requêtes SQL : des jeux de résultats vides de manière inattendue en raison de valeurs NULL. Le scénario consiste à sélectionner des enregistrements de la table Stock (dans la base de données Inventory) qui ne sont pas présents dans la table Products (dans la base de données Subset).

La clause NOT IN ne fonctionne pas comme prévu lorsque la colonne foreignStockId de la table Products contient des valeurs NULL. La présence même d'un seul NULL dans le jeu de résultats de la sous-requête NOT IN fait que la requête entière ne renvoie aucune ligne.

Solutions :

Pour corriger cela, nous devons exclure explicitement les valeurs NULL. Deux approches efficaces sont présentées :

1. Utilisation de IS NOT NULL :

Cette approche filtre les valeurs NULL de la sous-requête NOT IN :

<code class="language-sql">SELECT stock.IdStock, stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL);</code>
Copier après la connexion

2. Utilisation de NOT EXISTS :

La clause NOT EXISTS offre une alternative plus efficace et souvent plus claire :

<code class="language-sql">SELECT stock.idstock, stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock);</code>
Copier après la connexion

Comprendre le problème : la logique à trois valeurs

SQL utilise une logique à trois valeurs : Vrai, Faux et Inconnu. Une clause WHERE doit être évaluée à True pour qu'une ligne soit incluse dans l'ensemble de résultats. Le problème se pose parce que 'A' <> NULL est évalué à Unknown. Lorsque Unknown est présent dans une comparaison NOT IN, l'expression entière devient Unknown, ce qui donne un ensemble de résultats vide.

Exemple illustratif :

Considérez ceci :

Predicate True False Unknown
'A' NOT IN ('X','Y',NULL) True True Unknown

Le Unknown résultat découle de la comparaison de 'A' avec NULL. Par conséquent, la totalité de la clause WHERE est évaluée à Unknown et aucune ligne n'est renvoyée.

En employant IS NOT NULL ou NOT EXISTS, nous contournons cette ambiguïté et garantissons que la requête renvoie les résultats escomptés. L'approche NOT EXISTS est souvent préférée pour ses performances et sa lisibilité améliorées dans de tels scénarios.

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!

source:php.cn
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