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.

php  sql  mysql  null 

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.


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)

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


2

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


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

A consulta de @op não deixa possibilidade de NULLretorno do registro.
Quassnoi


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

        }
    }
}

Existem maneiras melhores de fazer isso na consulta sem ter que percorrer todas as linhas
Jiho Kang
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.