Maison > base de données > tutoriel mysql > le corps du texte

Comment MySQL gère-t-il les valeurs NULL dans les expressions IN ?

Barbara Streisand
Libérer: 2024-10-23 18:17:05
original
302 Les gens l'ont consulté

How Does MySQL Handle NULL Values in IN Expressions?

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');
Copier après la connexion

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 :

  1. Utilisez COALESCE pour remplacer les valeurs NULL par une valeur par défaut :
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and COALESCE(Error,'') not in ('Timeout','Connection Error');
Copier après la connexion
  1. Utilisez IS NULL et OR pour vérifier explicitement les valeurs NULL :
select count(*) from Table1 where CurrentDateTime>'2012-05-28 15:34:02.403504' and (Error IS NULL OR Error not in ('Timeout','Connection Error'));
Copier après la connexion
  1. Utilisez CASE pour attribuer un résultat booléen basé sur les valeurs d'erreur :
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;
Copier après la connexion

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!

source:php
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!