Sprawdzanie pustego pola w MySQL

100

Napisałem zapytanie, aby sprawdzić, czy użytkownicy spełniają określone kryteria, z których jednym jest adres e-mail.

Nasza strona pozwoli użytkownikowi mieć lub nie mieć adresu e-mail.

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

Czy to najlepszy sposób na sprawdzenie pustego pola w SQL? Właśnie wypróbowałem „NIE JEST NULL” i nadal zwróciło to rekord użytkowników bez adresu e-mail.

Powyższe zapytanie działa, ale z ciekawości zastanawiałem się, czy robię to we właściwy sposób.


źródło

Odpowiedzi:

274

Puste pole może być pustym ciągiem lub rozszerzeniem NULL.

Aby obsłużyć oba, użyj:

email > ''

które mogą skorzystać na rangedostępie, jeśli masz dużo pustych rekordów e-mail (oba typy) w tabeli.

Quassnoi
źródło
11
Jaka jest odwrotność tego? (Gdy chcesz tylko pola NULL lub „”)
Keylan
1
@Keylan: brak pojedynczego wyrażenia.
Quassnoi
5
@Keylan:! (E-mail> '')
SEoF
3
@SEoF: to nie będzie pasowaćNULL
Quassnoi
2
Mam taki sam komentarz jak Quassnoi. Wystawiam „select orig_id, hotline from normal_1952 where! (Hotline> '')” i jest jeden rekord z zerową linią, ale nie pasuje. Używam MySQL 5.6
Scott Chu
38

Tak, to co robisz jest poprawne. Sprawdzasz, aby upewnić się, że pole e-mail nie jest pustym ciągiem. NULL oznacza brak danych. Pusty ciąg ""to pusty ciąg o długości 0.

Możesz również dodać sprawdzenie zerowe

AND (email != "" OR email IS NOT NULL)
Yada
źródło
1
Twoje wyrażenie będzie również pasowało do pustych ciągów. OR email IS NOT NULLjest tutaj zbędny (wynika to z poprzedniego warunku).
Quassnoi
1
Co ciekawe, to nadal zwraca rekordy, które mają puste emailpole.
13
OR powinno być tutaj AND. „LUB e-mail NIE JEST NULL” dopasuje pusty ciąg wiadomości e-mail o długości 0.
pdavis
Uwaga pdavis komentarz "ALBO POWINIEN BYĆ I"
początkujący
13

Możesz użyć

IFNULL(email, '') > ''
Mathieu de Lorimier
źródło
2
Wspaniały! I nie potrzebujesz TRIM. Aby odwrócić, użyj IFNULL (e-mail, '') = ''.
mauromartini
2

Istnieje różnica między pustym ciągiem (e-mail! = "") A NULL. NULL jest null i pusty ciąg to coś.

Leslie
źródło
Dlaczego AND (email! = "" LUB email NIE JEST NULL) nie działa?
3
powinno byćAND (email != '' AND email IS NOT NULL)
thetaiko
@thetaiko: email IS NOT NULLjest tutaj zbędne. !=predykat nigdy nie będzie pasował do NULLwartości.
Quassnoi
co jeśli spróbujesz: AND (trim (email)! = '')
Leslie,
Wiem, że jestem raczej spóźniony na tę dyskusję, ale stwierdzenie będzie działać, jeśli odwrócisz kolejność: „AND ((email IS NOT NULL) AND (email! = '')). Jeśli jest oceniany w innej kolejności, instrukcja ma wartość null (nie TRUE), jeśli adres e-mail ma wartość NULL, a zatem nie będzie ani TRUE, ani FALSE. Więc czek IS NULL musi nastąpić PIERWSZY!
Curt,
2

To zadziała, ale nadal istnieje możliwość zwrócenia rekordu zerowego. Chociaż podczas wstawiania rekordu możesz ustawić adres e-mail na ciąg o długości zero, nadal możesz chcieć poradzić sobie z przypadkiem, gdy adres e-mail NULL dostał się w jakiś sposób do systemu.

     $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
źródło
Zapytanie @ op nie pozostawia możliwości NULLzwrócenia rekordu.
Quassnoi
-3

sprawdź ten kod pod kątem problemu:

$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
źródło
Są lepsze sposoby na zrobienie tego w zapytaniu bez konieczności przechodzenia przez każdy wiersz
Jiho Kang.