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.
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.
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)
Vous pourriez utiliser
IFNULL(email, '') > ''
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
');
Il existe une différence entre une chaîne vide (email! = "") Et NULL. NULL est null et une chaîne vide est quelque chose.
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