Maison >base de données >tutoriel mysql >Comment gérer les valeurs NULL dans le mot clé IN de MySQL pour un filtrage précis ?
Comprendre la gestion NULL dans le mot-clé IN de MySQL
Le mot-clé IN de MySQL renvoie un résultat booléen, mais il est important de noter que ce n'est pas toujours le cas renvoie 1 (vrai) ou 0 (faux). Le cas particulier de NULL peut introduire des comportements inattendus, en particulier lors du filtrage des données.
Le cas de NULL dans IN
La requête suivante exclut les lignes où la colonne Erreur est soit « Timeout » ou « Erreur de connexion » :
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and Error not in ('Timeout','Connection Error')
Cependant, cette requête n'inclut pas les lignes où l'erreur est NULL. En effet, l'opérateur IN est évalué à NULL lors de la comparaison d'une valeur à NULL. Par conséquent, l'expression « Error not in (« Timeout », « Connection Error ») » est fausse pour les lignes avec des valeurs NULL.
Solutions de contournement pour la gestion des NULL
Pour récupérer des résultats corrects lorsqu'il s'agit de valeurs NULL, il existe plusieurs approches :
1. Utilisez COALESCE() pour utiliser par défaut une chaîne vide
COALESCE(Error,'') not in ('Timeout','Connection Error')
2. Utilisez OR pour tester NULL et l'inégalité de valeur
Error IS NULL OR Error not in ('Timeout','Connection Error')
3. Utilisez CASE pour émuler l'évaluation booléenne
CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 END = 1
Sensibilité à la casse et performances
OR ne court-circuite pas, ce qui signifie qu'il évaluera les deux expressions même si le le premier est faux. CASE, en revanche, peut arrêter l'évaluation si la première condition est remplie. Cela conduit à de meilleures performances lorsqu'il existe de nombreuses valeurs NULL potentielles.
Exemple de comparaison nulle
Pour illustrer le comportement de NULL dans les expressions IN, considérez le tableau suivant :
msg | description |
---|---|
hi | greet |
NULL | nothing |
L'expression :
select 'hulk' as x, msg, description from tbl where msg not in ('bruce','banner')
renverra uniquement la ligne avec 'salut'. En effet, msg est NULL pour l'autre ligne, ce qui entraîne une comparaison indéterminée.
En conclusion, le mot-clé IN de MySQL peut renvoyer NULL lors de la comparaison avec des valeurs NULL, ce qui entraîne des résultats de filtrage inattendus. Pour résoudre ce problème, utilisez l'une des solutions de contournement décrites ci-dessus pour garantir une récupération précise des données.
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!