Mot clé MySQL IN et valeurs NULL
Le mot clé IN dans MySQL effectue une comparaison entre une expression donnée et une liste de valeurs, renvoyant un résultat booléen (VRAI/FAUX). Cependant, dans certains scénarios, MySQL gère les valeurs NULL de manière distincte.
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 à récupérer les lignes de la Table1 qui ont une valeur CurrentDateTime supérieure à « 2012-05-28 15:34:02.403504 » et une valeur d'erreur qui n'est pas égale à « Timeout » ou « Connection Error ». Étonnamment, cette requête exclut les lignes avec des valeurs NULL pour l'erreur.
Pourquoi MySQL ignore-t-il les valeurs NULL dans les expressions IN ?
MySQL traite NULL comme une valeur inconnue ou non définie. Lorsqu'il est utilisé dans une expression IN, MySQL évalue NULL comme ni TRUE ni FALSE, ce qui entraîne un résultat inconnu. Par conséquent, l'expression IN est elle-même évaluée à NULL.
Correction de la requête
Pour récupérer également des lignes avec des valeurs d'erreur NULL, il existe plusieurs approches :
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and COALESCE(Error,'') not in ('Timeout','Connection Error');
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and (Error IS NULL OR Error not in ('Timeout','Connection Error'));
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and CASE WHEN Error IS NULL THEN 1 ELSE Error not in ('Timeout','Connection Error') THEN 1 ELSE 0 END = 1;
Ces modifications garantissent que les lignes avec des valeurs d'erreur NULL sont incluses dans les résultats de la requête.
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!