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.

php  sql  mysql  null 

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.


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)

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


2

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


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

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

        }
    }
}

Są lepsze sposoby na zrobienie tego w zapytaniu bez konieczności przechodzenia przez każdy wiersz
Jiho Kang.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.