Comprobación de un campo vacío con MySQL

4 minutos de lectura

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 “NO ES NULO” y esto todavía devolvió un registro de usuarios sin que tuvieran una dirección de correo electrónico.

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

avatar de usuario
quassnoi

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

Para manejar ambos, use:

email > ''

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

  • ¿Cuál es el inverso de esto? (Para cuando solo desea campos NULL o ”)

    – Keylán

    26 de octubre de 2012 a las 14:59

  • @Keylan: ninguna expresión única.

    – Quassnoi

    26/10/2012 a las 15:45

  • @SEoF: esto no coincidirá NULL

    – Quassnoi

    16 de abril de 2013 a las 15:58

  • @Quassnoi: si “correo electrónico> ”” coincide con valores vacíos y nulos, entonces el inverso simplemente invierte la salida del booleano, que es “! (correo electrónico> ”)” como el bit “correo electrónico> ”” primero se evalúa y luego se invierte el resultado. A menos que me esté diciendo que la respuesta al ” correo electrónico > ” ” es verdadera, falsa o nula… entonces sí, no funcionará.

    – SEOF

    17 de abril de 2013 a las 9:48


  • Tengo el mismo comentario que el de Quassnoi. Emití “select orig_id,hotline from normal_1952 where !(hotline > ”)” y hay un registro con hotline nulo pero no coincide. Estoy usando MySQL 5.6

    – Scott Chu

    15 de abril de 2016 a las 10:16


avatar de usuario
Yada

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

También puede agregar el cheque nulo

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

  • Su expresión también coincidirá con las cadenas vacías. OR email IS NOT NULL es redundante aquí (está implícito en la condición anterior).

    – Quassnoi

    24 de febrero de 2010 a las 15:22


  • Interesante, esto todavía devuelve registros que tienen un vacío email campo.

    usuario275074

    24 de febrero de 2010 a las 15:26

  • El OR debe 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

    24 de febrero de 2010 a las 15:48

  • Observe el comentario de pdavis “O DEBE SER Y”

    – principiante

    18 de julio de 2017 a las 8:42

avatar de usuario
Mathieu de Lorimier

podrías usar

IFNULL(email, '') > ''

  • ¡Excelente! Y no necesitas el TRIM. Para invertir, use IFNULL(email, ”) = ”.

    – mauromartini

    18 de agosto de 2017 a las 19:25

Hay una diferencia entre una cadena vacía (correo electrónico! = “”) y NULL. NULL es nulo y una cadena vacía es algo.

Esto funcionará, pero aún existe la posibilidad de que se devuelva un registro nulo. Aunque es posible que esté configurando la dirección de correo electrónico en una cadena de longitud cero cuando inserte el registro, es posible que desee manejar el caso de que una dirección de correo electrónico NULA 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
     ');

  • La consulta de @op no deja ninguna posibilidad de que NULL registro devuelto.

    – Quassnoi

    24 de febrero de 2010 a las 15:40

avatar de usuario
scott hildebrand

Si desea encontrar todos los registros que no son NULOS y que están vacíos o tienen cualquier cantidad de espacios, esto funcionará:

LIKE '%\ '

Asegúrate de que haya un espacio después de la barra invertida. Más información aquí: http://dev.mysql.com/doc/refman/5.0/en/string-comparison-functions.html

  • La consulta de @op no deja ninguna posibilidad de que NULL registro devuelto.

    – Quassnoi

    24 de febrero de 2010 a las 15:40

avatar de usuario
muhammad muazzam

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

        }
    }
}

  • Hay mejores formas de hacer esto en la consulta sin tener que recorrer cada fila

    – Jiho Kang

    29 de noviembre de 2016 a las 8:10

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad