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