Comprobando un campo vacío con MySQL

100

Escribí una consulta para buscar usuarios con ciertos criterios, uno de ellos es que tienen una dirección de correo electrónico.

Nuestro sitio permitirá que un usuario tenga o no una dirección de correo electrónico.

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

¿Es esta la mejor manera de buscar un campo vacío en SQL? Acabo de probar "IS NOT NULL" y todavía devolvió un registro de usuario sin que tuvieran una dirección de correo electrónico.

La consulta anterior funciona, pero por curiosidad me pregunté si lo estaba haciendo de la manera correcta.


fuente

Respuestas:

274

Un campo vacío puede ser una cadena vacía o un NULL.

Para manejar ambos, use:

email > ''

que puede beneficiarse del rangeacceso si tiene muchos registros de correo electrónico vacíos (ambos tipos) en su tabla.

Quassnoi
fuente
11
¿Qué es lo inverso de esto? (Para cuando solo desea campos NULL o '')
Keylan
1
@Keylan: ninguna expresión única.
Quassnoi
5
@Keylan:! (Email> '')
SEoF
3
@SEoF: esto no coincidiráNULL
Quassnoi
2
Tengo el mismo comentario que Quassnoi. Publico "select orig_id, hotline from normal_1952 where! (Hotline> '')" y hay un registro con línea directa nula pero no coincide. Estoy usando MySQL 5.6
Scott Chu
38

Sí, lo que estás haciendo es correcto. Está comprobando que el campo de correo electrónico no sea una cadena vacía. NULL significa que faltan datos. Una cuerda vacía"" es una cadena en blanco con una longitud de 0.

También puede agregar el cheque nulo

AND (email != "" OR email IS NOT NULL)
Yada
fuente
1
Tu expresión también coincidirá con las cadenas vacías. OR email IS NOT NULLes redundante aquí (está implícito en la condición anterior).
Quassnoi
1
Interesante, esto todavía devuelve registros que tienen un emailcampo vacío .
13
El OR debería ser un AND aquí. "O el correo electrónico NO ES NULO" coincidirá con una cadena de correo electrónico en blanco con una longitud de 0.
pdavis
Observe el comentario de pdavis "O DEBE SER Y"
principiante
13

Podrías usar

IFNULL(email, '') > ''
Mathieu de Lorimier
fuente
2
¡Excelente! Y no necesitas el TRIM. Para invertir, use IFNULL (email, '') = ''.
mauromartini
2

Hay una diferencia entre una cadena vacía (email! = "") Y NULL. NULL es nulo y una cadena vacía es algo.

Leslie
fuente
¿Cuál es la razón por la que AND (email! = "" OR email IS NOT NULL) está fallando?
3
debería serAND (email != '' AND email IS NOT NULL)
thetaiko
@thetaiko: email IS NOT NULLaquí es redundante. !=el predicado nunca coincidirá con un NULLvalor.
Quassnoi
¿Qué pasa si intenta: Y (recorte (correo electrónico)! = '')
Leslie
Sé que "llegué bastante tarde a esta discusión, pero la declaración funcionará si inviertes el orden:" Y ((el correo electrónico NO ES NULO) Y (¡correo electrónico! = '')). Si se evalúa en el otro orden, la declaración se evalúa como nula (no TRUE) si la dirección de correo electrónico es NULL y, por lo tanto, no será TRUE ni FALSE. ¡Así que la verificación de IS NULL tiene que venir PRIMERO!
Curt
2

Esto funcionará, pero aún existe la posibilidad de que se devuelva un registro nulo. Aunque puede estar configurando la dirección de correo electrónico en una cadena de longitud cero cuando inserta el registro, es posible que aún desee manejar el caso de que una dirección de correo electrónico NULL ingrese al sistema de alguna manera.

     $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
fuente
La consulta de @ op no deja posibilidad de que se NULLdevuelva el registro.
Quassnoi
-3

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

        }
    }
}
usuario3103831
fuente
Hay mejores formas de hacer esto en la consulta sin tener que recorrer cada fila
Jiho Kang