Mit MySQL nach einem leeren Feld suchen

100

Ich habe eine Abfrage geschrieben, um nach Benutzern mit bestimmten Kriterien zu suchen. Eine davon ist, dass sie eine E-Mail-Adresse haben.

Auf unserer Website kann ein Benutzer eine E-Mail-Adresse haben oder nicht.

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

Ist dies der beste Weg, um in SQL nach einem leeren Feld zu suchen? Ich habe gerade "IS NOT NULL" ausprobiert und dies hat immer noch einen Benutzerdatensatz zurückgegeben, ohne dass dieser eine E-Mail-Adresse hat.

Die obige Abfrage funktioniert, aber aus Neugier habe ich mich gefragt, ob ich es richtig mache.


quelle

Antworten:

274

Ein leeres Feld kann entweder eine leere Zeichenfolge oder eine sein NULL.

Verwenden Sie:

email > ''

Dies kann vom rangeZugriff profitieren, wenn Ihre Tabelle viele leere E-Mail-Datensätze (beide Typen) enthält.

Quassnoi
quelle
11
Was ist das Gegenteil davon? (Wenn Sie nur NULL- oder '' Felder möchten)
Keylan
1
@ Keylan: kein einzelner Ausdruck.
Quassnoi
5
@Keylan :! (E-Mail> '')
SEoF
3
@ SEoF: das wird nicht passenNULL
Quassnoi
2
Ich habe den gleichen Kommentar wie Quassnoi. Ich gebe "select orig_id, hotline from normal_1952 where! (Hotline> '')" aus und es gibt einen Datensatz mit null Hotline, aber er stimmt nicht überein. Ich verwende MySQL 5.6
Scott Chu
38

Ja, was Sie tun, ist richtig. Sie überprüfen, ob das E-Mail-Feld keine leere Zeichenfolge ist. NULL bedeutet, dass die Daten fehlen. Eine leere Zeichenfolge ""ist eine leere Zeichenfolge mit der Länge 0.

Sie können auch die Nullprüfung hinzufügen

AND (email != "" OR email IS NOT NULL)
Yada
quelle
1
Ihr Ausdruck stimmt auch mit den leeren Zeichenfolgen überein. OR email IS NOT NULList hier redundant (dies wird durch die vorherige Bedingung impliziert).
Quassnoi
1
Interessanterweise gibt dies immer noch Datensätze zurück, die ein leeres emailFeld haben.
13
Der OP sollte hier ein UND sein. "ODER E-Mail IST NICHT NULL"
stimmt
Beachten Sie pdavis Kommentar "ODER SOLLTE UND"
Anfänger
13

Du könntest benutzen

IFNULL(email, '') > ''
Mathieu de Lorimier
quelle
2
Toll! Und du brauchst das TRIM nicht. Verwenden Sie zum Invertieren IFNULL (E-Mail, '') = ''.
Mauromartini
2

Es gibt einen Unterschied zwischen einer leeren Zeichenfolge (email! = "") Und NULL. NULL ist null und eine leere Zeichenfolge ist etwas.

Leslie
quelle
Welches ist der Grund, warum AND (email! = "" ODER E-Mail NICHT NULL ist) fehlschlägt?
3
sollte seinAND (email != '' AND email IS NOT NULL)
Thetaiko
@thetaiko: email IS NOT NULList hier überflüssig. !=Prädikat wird niemals mit einem NULLWert übereinstimmen.
Quassnoi
Was ist, wenn Sie versuchen: UND (trimmen (E-Mail)! = '')
Leslie
Ich weiß, dass ich zu spät zu dieser Diskussion komme, aber die Anweisung funktioniert, wenn Sie die Reihenfolge umkehren: "AND ((E-Mail ist nicht null) AND (E-Mail! = '')). Wenn die Anweisung in der anderen Reihenfolge ausgewertet wird, wird sie als null (nicht TRUE) ausgewertet, wenn die E-Mail-Adresse NULL ist, und ist daher weder TRUE noch FALSE. Der IS NULL Check muss also ZUERST kommen!
Curt
2

Dies funktioniert, es besteht jedoch weiterhin die Möglichkeit, dass ein Nulldatensatz zurückgegeben wird. Obwohl Sie die E-Mail-Adresse beim Einfügen des Datensatzes möglicherweise auf eine Zeichenfolge mit der Länge Null setzen, möchten Sie möglicherweise dennoch den Fall behandeln, dass eine NULL-E-Mail-Adresse irgendwie in das System gelangt.

     $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
     ');
pdavis
quelle
Die Abfrage von @ op lässt keine Möglichkeit, dass der NULLDatensatz zurückgegeben wird.
Quassnoi
0

Wenn Sie alle Datensätze suchen möchten, die nicht NULL sind und entweder leer sind oder eine beliebige Anzahl von Leerzeichen enthalten, funktioniert dies wie folgt:

LIKE '%\ '

Stellen Sie sicher, dass nach dem Backslash ein Leerzeichen vorhanden ist. Weitere Informationen hier: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

Scott Hildebrand
quelle
-3

Überprüfen Sie diesen Code auf das Problem:

$sql = "SELECT * FROM tablename WHERE condition";

$res = mysql_query($sql);

while ($row = mysql_fetch_assoc($res)) {

    foreach($row as $key => $field) {  

        echo "<br>";

        if(empty($row[$key])){

            echo $key." : empty field :"."<br>"; 

        }else{

        echo $key." =" . $field."<br>";     

        }
    }
}
user3103831
quelle
Es gibt bessere Möglichkeiten, dies in Abfragen zu tun, ohne jede einzelne Zeile
durchlaufen zu müssen