Controllo di un campo vuoto con MySQL


100

Ho scritto una query per verificare la presenza di utenti con determinati criteri, uno è che hanno un indirizzo e-mail.

Il nostro sito consentirà a un utente di avere o meno un indirizzo email.

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

È questo il modo migliore per verificare la presenza di un campo vuoto in SQL? Ho appena provato "NON È NULLO" e questo ha comunque restituito un record di utenti senza che avessero un indirizzo email.

La query sopra funziona ma per curiosità mi sono chiesto se lo sto facendo nel modo corretto.

php  sql  mysql  null 

Risposte:


274

Un campo vuoto può essere una stringa vuota o un file NULL.

Per gestirli entrambi, usa:

email > ''

che può beneficiare rangedell'accesso se hai molti record di posta elettronica vuoti (entrambi i tipi) nella tua tabella.


11
Qual è il contrario di questo? (Per quando vuoi solo i campi NULL o "")
Keylan

1
@ Keylan: nessuna singola espressione.
Quassnoi

5
@Keylan:! (Email> '')
SEoF

3
@SEoF: questo non corrisponderàNULL
Quassnoi

2
Ho lo stesso commento di Quassnoi. Emetto "select orig_id, hotline from normal_1952 dove! (Hotline> '')" e c'è un record con hotline nulla ma non corrisponde. Sto usando MySQL 5.6
Scott Chu

38

Sì, quello che stai facendo è corretto. Stai controllando per assicurarti che il campo email non sia una stringa vuota. NULL significa che i dati sono mancanti. Una stringa vuota ""è una stringa vuota con lunghezza 0.

Puoi anche aggiungere il controllo null

AND (email != "" OR email IS NOT NULL)

1
La tua espressione corrisponderà anche alle stringhe vuote. OR email IS NOT NULLè ridondante qui (è implicito nella condizione precedente).
Quassnoi

1
Interessante, restituisce ancora i record che hanno un emailcampo vuoto .

13
L'OR dovrebbe essere un AND qui. "OR email IS NOT NULL" corrisponderà a una stringa di email vuota con lunghezza 0.
pdavis

Notare il commento di pdavis "O DEVE ESSERE AND"
principiante


2

C'è una differenza tra una stringa vuota (email! = "") E NULL. NULL è null e una stringa vuota è qualcosa.


Qual è il motivo per cui AND (email! = "" OR email IS NOT NULL) non funziona?

3
dovrebbe essereAND (email != '' AND email IS NOT NULL)
thetaiko

@thetaiko: email IS NOT NULLqui è ridondante. !=predicato non corrisponderà mai a un NULLvalore.
Quassnoi

e se provassi: AND (trim (email)! = '')
Leslie

So di "essere in ritardo per questa discussione, ma l'affermazione funzionerà se si inverte l'ordine:" AND ((email IS NOT NULL) AND (email! = '')). Se valutata nell'altro ordine, l'istruzione viene valutata come null (non TRUE) se l'indirizzo di posta elettronica è NULL e quindi non sarà né TRUE né FALSE. Quindi il controllo IS NULL deve essere PRIMO!
Curt

2

Questo funzionerà ma c'è ancora la possibilità che venga restituito un record nullo. Sebbene tu possa impostare l'indirizzo e-mail su una stringa di lunghezza zero quando inserisci il record, potresti comunque voler gestire il caso in cui un indirizzo e-mail NULL entri in qualche modo nel sistema.

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

La query di @ op non lascia alcuna possibilità di NULLrestituzione del record.
Quassnoi


-3

controlla questo codice per il problema:

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

        }
    }
}

Esistono modi migliori per eseguire questa operazione nelle query senza dover scorrere ogni singola riga
Jiho Kang
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.