¿Cómo verifico si una columna está vacía o nula en MySQL?

288

Tengo una columna en una tabla que puede contener valores nulos o vacíos. ¿Cómo verifico si una columna está vacía o nula en las filas presentes en una tabla?

(e.g. null or '' or '  ' or '      ' and ...)
priya
fuente
1
Código MySQL: select isnull(mycolumn) from mytabledevuelve 1 si mycolumn es nulo.
Eric Leschinski
2
¿Qué pasa con la longitud (trim (mycolumn))> 0?
Cyril Jacquart
Para MSSQL> DONDE COLUMNA <> '' O DONDE LEN (COLUMNA)> 0 O DONDE NULLIF (LTRIM (RTRIM (COLUMN)), '') NO ES NULO
DxTx

Respuestas:

444

Esto seleccionará todas las filas donde some_colestá NULLo ''(cadena vacía)

SELECT * FROM table WHERE some_col IS NULL OR some_col = '';
maček
fuente
77
Si cambia la condición a WHERE some_col IS NULL OR some_col = ' '(un espacio insertado en la cadena), entonces funciona tanto en MySQL como en Oracle, consulte la respuesta de "onedaywhen". some_col = ''no funciona en Oracle ya que las cadenas vacías significan NULL allí.
Johanna
1
@Johanna pero si cambias a ' ', entonces no funcionará en SQLite. Solo maneja la coincidencia de cadenas idénticas / directas.
Magne
131

Según lo definido por el estándar SQL-92, al comparar dos cadenas de diferentes anchos, el valor más estrecho se rellena con espacios a la derecha para que tenga el mismo ancho que el valor más ancho. Por lo tanto, todos los valores de cadena que consisten completamente en espacios (incluidos los espacios cero) se considerarán iguales, por ejemplo

'' = ' ' IS TRUE
'' = '  ' IS TRUE
' ' = '  ' IS TRUE
'  ' = '      ' IS TRUE
etc

Por lo tanto, esto debería funcionar independientemente de cuántos espacios componen el some_colvalor:

SELECT * 
  FROM T
 WHERE some_col IS NULL 
       OR some_col = ' ';

o más sucintamente:

SELECT * 
  FROM T
 WHERE NULLIF(some_col, ' ') IS NULL;
un día cuando
fuente
66
Gracias por mencionar los espacios acolchados. Puede beneficiarse de ellos y cambiar la condición a WHERE some_col IS NULL OR some_col = ' '(un espacio insertado en la cadena) y luego funciona tanto en MySQL como en Oracle. some_col = ''no funciona en Oracle ya que las cadenas vacías significan NULL allí y la condición completa se convierte en NULL.
Johanna
Mi requisito era encontrarme SELECT * FROM T WHERE some_col IS NOT NULL OR same_col <> ' '; y SELECT * FROM T WHERE NULLIF(some_col, ' ') IS NOT NULL;trabajar para mí en MySQL. Espero que esto sea útil.
Dinuka Dayarathna
Realmente '' = ' 'funciona en SQLServer pero no en SQLite, por lo que puedo decir, desde que lo pruebo ahora.
Magne
66

Una forma más corta de escribir la condición:

WHERE some_col > ''

Como null > ''produce unknown, esto tiene el efecto de filtrar nullcadenas vacías y ambas .

Andomar
fuente
2
¿Hay alguna manera de obtener el reverso de esto, obteniendo todos los registros donde es NULL o una cadena vacía?
Joshua Pinter
14
@JoshPinter:coalesce(some_col, '') = ''
Andomar
66
Esto puede haber sido cierto alguna vez, pero no funciona en MySQL 14.14.
Gunnar Þór Magnússon
funciona muy bien y, de hecho, es la única forma en que podría descubrir cómo filtrar los campos nulos y vacíos en MariaDB
Neal Davis
1
Uso some_col <> '' para encontrar el reverso de esto
Chargnn
18

Puede probar si una columna es nula o no es nula utilizando WHERE col IS NULLo, WHERE col IS NOT NULLpor ejemplo,

SELECT myCol 
FROM MyTable 
WHERE MyCol IS NULL 

En su ejemplo, tiene varias permutaciones de espacio en blanco. Puede eliminar el espacio en blanco usando TRIMy puede usar COALESCEpor defecto un valor NULL (COALESCE devolverá el primer valor no nulo de los valores que proporcione.

p.ej

SELECT myCol
FROM MyTable
WHERE TRIM(COALESCE(MyCol, '') = '' 

Esta consulta final devolverá filas donde MyColes nulo o tiene cualquier longitud de espacio en blanco.

Si puede evitarlo, es mejor no tener una función en una columna en la cláusula WHERE, ya que dificulta el uso de un índice. Si simplemente desea verificar si una columna es nula o está vacía, es mejor que haga esto:

SELECT myCol
FROM MyTable
WHERE MyCol IS NULL OR MyCol =  '' 

Ver TRIM COALESCE y IS NULL para más información.

También trabajar con valores nulos de los documentos de MySQL

Código mago
fuente
2
Usted presenta la solución real de una manera muy complicada. Primero presentas una solución incompleta a su problema "donde mycol es nulo". Luego presenta una solución usando dos funciones anidadas en la cláusula where, incluso cuando dice que esto debe evitarse. Solo entonces llegas a la solución real. En el futuro, presente su solución real primero.
Falta un signo )antes =de su segundo ejemplo
Rorrim
15

Otro método sin DÓNDE, prueba esto ...

Seleccionará valores vacíos y NULL

SELECT ISNULL(NULLIF(fieldname,''))  FROM tablename
PodTech.io
fuente
esto devuelve 1 si hay algo nulo, ¿por qué es así?
noobie-php
NULLIF verifica el nombre de campo para el valor vacío y se convertiría a NULL si estaba vacío. ISNULL devuelve 1 (verdadero) si NULLIF ha cambiado con éxito un campo vacío a NULL o si ya era NULL ... intente por sí mismo en un campo nulo y vacío en una tabla con las dos funciones separadas select isnull (X) , seleccione nullif (y)
PodTech.io
9

Ya sea

SELECT IF(field1 IS NULL or field1 = '', 'empty', field1) as field1 from tablename

o

SELECT case when field1 IS NULL or field1 = ''
        then 'empty'
        else field1
   end as field1 from tablename
Reynante Daitol
fuente
6

Odio los campos desordenados en mis bases de datos. Si la columna puede ser una cadena en blanco o nula, prefiero arreglar esto antes de hacer la selección cada vez, así:

UPDATE MyTable SET MyColumn=NULL WHERE MyColumn='';
SELECT * FROM MyTable WHERE MyColumn IS NULL

Esto mantiene los datos ordenados, siempre y cuando no necesite diferenciar específicamente entre NULL y vacío por alguna razón.

Keith Johnson
fuente
5

tratar

SELECT 0 IS NULL ,  '' IS NULL , NULL IS NULL

-> 0, 0, 1

o

SELECT ISNULL('  ') , ISNULL( NULL )
 -> 0 ,1

Referencia

diEcho
fuente
5

Esta declaración es mucho más limpia y más legible para mí:

select * from my_table where ISNULL(NULLIF(some_col, ''));
Amaynut
fuente
4

Mientras comprobaba el null or Emptyvalor de una columna en mi proyecto, noté que hay algunas preocupaciones de soporte en varias bases de datos.

Cada base de datos no es compatible TRIM método.

A continuación se muestra la matriz solo para comprender los métodos admitidos por diferentes bases de datos.

La función TRIM en SQL se usa para eliminar el prefijo o sufijo especificado de una cadena. El patrón más común que se elimina son los espacios en blanco. Esta función se llama de manera diferente en diferentes bases de datos:

  • MySQL: TRIM(), RTRIM(), LTRIM()
  • Oráculo: RTRIM(), LTRIM()
  • Servidor SQL: RTRIM(), LTRIM()

Cómo verificar vacío / nulo: -

A continuación hay dos formas diferentes según las diferentes bases de datos:

La sintaxis para estas funciones de recorte son:

  1. Uso de Trim para verificar

    SELECT FirstName FROM UserDetails WHERE TRIM(LastName) IS NULL

  2. Uso de LTRIM y RTRIM para verificar

    SELECT FirstName FROM UserDetails WHERE LTRIM(RTRIM(LastName)) IS NULL

Las dos formas anteriores proporcionan el mismo resultado, solo utilícelas según su soporte de DataBase. Simplemente devuelve la tabla FirstNamefrom UserDetailssi tiene un vacíoLastName

Esperando que esto te ayude :)

Vikash Pandey
fuente
3

Si desea que los valores NULL se presenten al final al hacer un ORDER BY, intente esto:

SELECT * FROM my_table WHERE NULLIF(some_col, '') IS NULL;
Hombre fantasma
fuente
3

También puedes hacer

SELECT * FROM table WHERE column_name LIKE ''

El ser inverso

SELECT * FROM table WHERE column_name NOT LIKE ''
brenjt
fuente
Aparentemente no funciona: select NULL like ''retornos NULL, al menos en MySQL.
Titus
2
SELECT * FROM tbl WHERE trim(IFNULL(col,'')) <> '';
Baltazar Moreno
fuente
Tuve un problema en comparación con un campo que a veces era nulo. Esto ayudó:col1 != IFNULL(col2,'')
webaholik
1

Comprobar nulo

$column is null
isnull($column)

Verificar vacío

$column != ""

Sin embargo, siempre debe establecer NOT NULL para la columna, la
optimización de mysql solo puede manejar un nivel IS NULL

ajreal
fuente
3
Nunca aceptar NULLvalores es otro tema de discusión. No creo que sea apropiado hacer esa recomendación sin dar su razonamiento.
maček 12/12/11
Incluí, sé paciente. Además, realmente hace la vida difícil usar NULL (al igual que esta pregunta).
ajreal 12/12/11
55
Esa es una recomendación terrible. Establecer NOT NULL en una columna cuyo valor puede no conocerse en el momento de INSERT solo sirve para alentar el uso de valores "nulos" no estándar como -1y ''.
Dan Bechard
@ Dan, si no está seguro de cuál es el valor durante la inserción, puede tener dificultades para llevar a cabo cualquier optimización posible
ajreal
0
select * from table where length(RTRIM(LTRIM(column_name))) > 0
Hakan Ilgar
fuente
1
¿De qué sirve usar ambos RTRIMy LTRIM, pero no TRIM?
Nico Haase
0

En mi caso, el espacio se ingresó en la columna durante la importación de datos y, aunque parecía una columna vacía, su longitud era 1. Entonces, antes que nada, verifiqué la longitud de la columna vacía y length(column)luego, en base a esto, podemos escribir una consulta de búsqueda

SELECCIONAR * DE LA TABLA DONDE LONGITUD (COLUMNA) = longitud de columna para columna vacía

SEÑOR Y
fuente
-1

intente esto si el tipo de datos es una cadena y la fila es nula

SELECT * FROM table WHERE column_name IS NULL OR column_name = ''

si el tipo de datos es int o la columna es 0, intente esto

SELECT * FROM table WHERE column_name > = 0
Monis Qureshi
fuente
-2
SELECT column_name FROM table_name WHERE column_name IN (NULL, '')
SaAy
fuente
1
Respuesta incorrecta. Esto no seleccionará NULL.
Pang