Maison >base de données >tutoriel mysql >Comment le mot clé IN de MYSQL gère-t-il les valeurs NULL dans les comparaisons ?
Traitement par mot-clé MYSQL IN des valeurs NULL
Les requêtes SQL utilisent souvent le mot-clé IN pour filtrer les résultats en fonction d'un ensemble de valeurs spécifiées. Cependant, lorsqu'il s'agit de valeurs NULL, le mot clé IN de MYSQL présente un comportement unique qui nécessite d'être pris en compte.
Problème : le mot clé IN exclut les valeurs NULL
Considérez la requête suivante :
select count(*) from Table1 where CurrentDateTime>='2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error');
Cette requête vise à exclure les lignes avec des valeurs d'erreur de « Délai d'expiration » ou « Erreur de connexion », mais elle omet de manière inattendue les lignes où l'erreur est NULL. Pour prendre en compte les valeurs NULL, une condition supplémentaire (OR Error est NULL) doit être ajoutée.
Raison de l'exclusion NULL
Le mot clé IN compare les expressions utilisant des valeurs booléennes ( 1/0). Cependant, dans certains cas, il peut renvoyer NULL au lieu de valeurs booléennes. Lorsque Error est NULL, l'expression IN devient :
Error <> 'Timeout' AND Error <> 'Connection Error'
Les règles de comparaison nulles s'appliquent ici. Comme la valeur de l'erreur est NULL, l'expression ne peut pas être évaluée comme vraie ou fausse.
Solutions pour inclure des valeurs NULL
Pour inclure des lignes avec des valeurs NULL, on peut utilisez les solutions suivantes :
COALESCE avec IN :
COALESCE(Error,'') not in ('Timeout','Connection Error');
OR Condition avec IS NULL :
Error IS NULL OR Error not in ('Timeout','Connection Error');
CASE Expression avec court-circuit :
CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 END = 1
Exemple
Considérez les données suivantes :
create table tbl(msg varchar(100) null, description varchar(100) not null); insert into tbl values('hi', 'greet'), (null, 'nothing');
La requête :
select 'hulk' as x, msg, description from tbl where msg not in ('bruce','banner');
Renverra uniquement « salut » car l'expression NOT IN est évaluée à NULL pour la ligne avec une valeur de message NULL.
Conclusion
Le mot-clé IN dans MYSQL traite les valeurs NULL comme un cas particulier lors des comparaisons. Les développeurs utilisant IN doivent être conscients de ce comportement et mettre en œuvre une gestion appropriée pour éviter d'exclure ou de mal interpréter les lignes avec des valeurs NULL.
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!