web-dev-qa-db-fra.com

Rechercher un champ vide avec MySQL

J'ai écrit une requête pour rechercher des utilisateurs avec certains critères, l'un d'entre eux étant une adresse électronique.

Notre site permettra à un utilisateur d'avoir ou non une adresse email.

$aUsers=$this->readToArray('
 SELECT `userID` 
 FROM `users` 
 WHERE `userID` 
 IN(SELECT `userID`
         FROM `users_indvSettings`
  WHERE `indvSettingID`=5 AND `optionID`='.$time.')
  AND `email`!=""
 ');

Est-ce le meilleur moyen de rechercher un champ vide dans SQL? Je viens d'essayer "IS NOT NULL" et cela renvoyait toujours un enregistrement d'utilisateurs sans qu'ils aient une adresse email.

La requête ci-dessus fonctionne, mais par curiosité, je me suis demandé si je le faisais correctement.

92
user275074

Un champ vide peut être une chaîne vide ou un NULL.

Pour gérer les deux, utilisez:

email > ''

qui peut bénéficier de l'accès range si vous avez beaucoup d'enregistrements d'email vides (les deux types) dans votre table.

264
Quassnoi

Oui, ce que vous faites est correct. Vous vérifiez que le champ email n’est pas une chaîne vide. NULL signifie que les données sont manquantes. Une chaîne vide "" est une chaîne vide de 0.

Vous pouvez aussi ajouter le chèque nul

AND (email != "" OR email IS NOT NULL)
35
Yada

Vous pourriez utiliser

IFNULL(email, '') > ''
10

Cela fonctionnera mais il est toujours possible qu'un enregistrement nul soit renvoyé. Bien que vous puissiez définir l'adresse électronique sur une chaîne de longueur zéro lorsque vous insérez l'enregistrement, vous souhaiterez peut-être néanmoins gérer le cas d'une adresse électronique NULL entrant dans le système d'une manière ou d'une autre.

     $aUsers=$this->readToArray('
     SELECT `userID` 
     FROM `users` 
     WHERE `userID` 
     IN(SELECT `userID`
               FROM `users_indvSettings`
               WHERE `indvSettingID`=5 AND `optionID`='.$time.')
     AND `email` != "" AND `email` IS NOT NULL
     ');
2
pdavis

Il existe une différence entre une chaîne vide (email! = "") Et NULL. NULL est null et une chaîne vide est quelque chose.

1
Leslie

Si vous voulez trouver tous les enregistrements qui ne sont pas NULL, vides ou avec un nombre quelconque d'espaces, cela fonctionnera:

LIKE '%\ '

Assurez-vous qu'il y a un espace après la barre oblique inverse. Plus d'infos ici: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

0
Scott Hildebrand