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.

php  sql  mysql  null 

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.


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)

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


2

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


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
     ');

Die Abfrage von @ op lässt keine Möglichkeit, dass der NULLDatensatz zurückgegeben wird.
Quassnoi


-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>";     

        }
    }
}

Es gibt bessere Möglichkeiten, dies in Abfragen zu tun, ohne jede einzelne Zeile
durchlaufen zu müssen
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.