Verificando um campo vazio com MySQL

100

Eu escrevi uma consulta para verificar se há usuários com determinados critérios, sendo que eles têm um endereço de e-mail.

Nosso site permitirá que um usuário tenha ou não um endereço de 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`!=""
 ');

Esta é a melhor maneira de verificar se há um campo vazio no SQL? Acabei de tentar "IS NOT NULL" e ainda retornou um registro de usuário sem um endereço de e-mail.

A consulta acima funciona, mas por curiosidade me perguntei se estou fazendo da maneira correta.


fonte

Respostas:

274

Um campo vazio pode ser uma string vazia ou um NULL.

Para lidar com ambos, use:

email > ''

que pode se beneficiar do rangeacesso se você tiver muitos registros de e-mail vazios (ambos os tipos) em sua tabela.

Quassnoi
fonte
11
Qual é o inverso disso? (Para quando você quiser apenas os campos NULL ou '')
Keylan
1
@Keylan: nenhuma expressão única.
Quassnoi
5
@Keylan:! (Email> '')
SEoF
3
@SEoF: isto não correspondeNULL
Quassnoi
2
Eu tenho o mesmo comentário que o de Quassnoi. Emito "select orig_id, hotline from normal_1952 where! (Hotline> '')" e há um registro com linha direta nula, mas não corresponde. Estou usando o MySQL 5.6
Scott Chu
38

Sim, o que você está fazendo está correto. Você está verificando se o campo de e-mail não é uma string vazia. NULL significa que os dados estão faltando. Uma string vazia ""é uma string em branco com comprimento 0.

Você também pode adicionar a verificação de nulo

AND (email != "" OR email IS NOT NULL)
Yada
fonte
1
Sua expressão também corresponderá às strings vazias. OR email IS NOT NULLé redundante aqui (está implícito na condição anterior).
Quassnoi
1
Interessante, isso ainda retorna registros com um emailcampo vazio .
13
O OR deve ser um AND aqui. "OR email IS NOT NULL" corresponderá a uma string de email em branco com comprimento de 0.
pdavis
Observe o comentário de pdavis "OU DEVE SER E"
iniciante
13

Você poderia usar

IFNULL(email, '') > ''
Mathieu de Lorimier
fonte
2
Ótimo! E você não precisa do TRIM. Para inverter, use IFNULL (email, '') = ''.
mauromartini
2

Há uma diferença entre uma string vazia (email! = "") E NULL. NULL é nulo e uma string vazia é alguma coisa.

Leslie
fonte
É por isso que AND (email! = "" OR email IS NOT NULL) está falhando?
3
deveria serAND (email != '' AND email IS NOT NULL)
thetaiko
@thetaiko: email IS NOT NULLé redundante aqui. !=predicado nunca corresponderá a um NULLvalor.
Quassnoi
e se você tentar: AND (trim (email)! = '')
Leslie
Eu sei que estou um pouco atrasado para esta discussão, mas a instrução funcionará se você inverter a ordem: "AND ((email IS NOT NULL) AND (email! = '')). Se avaliada na outra ordem, a instrução será avaliada como nula (não TRUE) se o endereço de e-mail for NULL e, portanto, não será TRUE ou FALSE. Portanto, a verificação IS NULL tem que vir PRIMEIRO!
Curt
2

Isso funcionará, mas ainda há a possibilidade de um registro nulo ser retornado. Embora você possa estar configurando o endereço de e-mail para uma string de comprimento zero ao inserir o registro, você ainda pode querer lidar com o caso de um endereço de e-mail NULL entrar no sistema de alguma forma.

     $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
fonte
A consulta de @op não deixa possibilidade de NULLretorno do registro.
Quassnoi
0

Se você quiser encontrar todos os registros que não sejam NULL, estejam vazios ou tenham qualquer número de espaços, isso funcionará:

LIKE '%\ '

Certifique-se de que haja um espaço após a barra invertida. Mais informações aqui: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

Scott Hildebrand
fonte
-3

verifique este código para o 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>";     

        }
    }
}
user3103831
fonte
Existem maneiras melhores de fazer isso na consulta sem ter que percorrer todas as linhas
Jiho Kang