MySQL: selección de filas donde una columna es nula


270

Tengo un problema en el que cuando intento seleccionar las filas que tienen un NULL para una determinada columna, devuelve un conjunto vacío. Sin embargo, cuando miro la tabla en phpMyAdmin, dice nulo para la mayoría de las filas.

Mi consulta se parece a esto:

SELECT pid FROM planets WHERE userid = NULL

Conjunto vacío cada vez.

Se dijo que muchos lugares se aseguraban de que no se almacenara como "NULL" o "null" en lugar de un valor real, y uno dijo que intentara buscar solo un espacio ( userid = ' ') pero ninguno de estos funcionó. Se sugirió no usar MyISAM y usar innoDB porque MyISAM tiene problemas para almacenar null. Cambié la tabla a innoDB, pero ahora siento que el problema puede ser que todavía no es nulo debido a la forma en que podría convertirlo. Me gustaría hacer esto sin tener que recrear la tabla como innoDB o cualquier otra cosa, pero si tengo que hacerlo, ciertamente puedo intentarlo.


1
MyISAM no tiene problemas para almacenar nulo. La semántica de los NULL deben ser independientes del motor.
MarkR

Respuestas:


513

SQL NULL es especial, y tienes que hacerlo WHERE field IS NULL, ya que NULL no puede ser igual a nada,

incluyéndose a sí mismo (es decir: NULL = NULL siempre es falso).

Ver Rule 3 https://en.wikipedia.org/wiki/Codd%27s_12_rules


25
Es desconocido: no es falso. SQL utiliza la lógica de tres valores.
Martin Smith

39
NULL = NULL no es realmente FALSE, es NULL nuevamente. Pero tampoco es VERDADERO, por lo que IF (NULL = NULL) no se ejecutará.
Konerak

1
vea también @obe respuesta: SELECCIONE 1 <=> 1, NULL <=> NULL, 1 <=> NULL; -> 1, 1, 0
Thomas

No solo no es igual a nada, tampoco es igual a nada. En otras palabras, select * from foo where bar <> "abc"será no devolver filas, donde la barra es nulo. Eso me dejó sin aliento hoy. Los documentos llaman <>al operador "no es igual a", pero en realidad es el operador "es igual a algo distinto de".
StackOverthrow


39

Como todos reciben respuestas, quiero agregar un poco más. También me enfrenté al mismo problema.

¿Por qué falló su consulta? Tienes,

SELECT pid FROM planets WHERE userid = NULL;

Esto no le dará el resultado esperado, porque desde mysql doc

En SQL, el valor NULL nunca es verdadero en comparación con cualquier otro valor, incluso NULL. Una expresión que contiene NULL siempre produce un valor NULL a menos que se indique lo contrario en la documentación para los operadores y las funciones involucradas en la expresión.

El énfasis es mío.

Para buscar valores de columna que sean NULL, no puede usar una expr = NULLprueba. La siguiente declaración no devuelve filas, porque expr = NULLnunca es cierto para ninguna expresión

Solución

SELECT pid FROM planets WHERE userid IS NULL; 

Para probar NULL, utilice los operadores IS NULLy IS NOT NULL.



11

Información de http://w3schools.com/sql/sql_null_values.asp :

1) Los valores NULL representan datos desconocidos que faltan.

2) Por defecto, una columna de tabla puede contener valores NULL.

3) Los valores NULL se tratan de manera diferente a otros valores

4) No es posible comparar NULL y 0; No son equivalentes.

5) No es posible probar valores NULL con operadores de comparación, como =, <o <>.

6) Tendremos que usar los operadores IS NULL y IS NOT NULL en su lugar

Entonces, en caso de su problema:

SELECT pid FROM planets WHERE userid IS NULL

7

Tuve el mismo problema donde consulta:

SELECT * FROM 'column' WHERE 'column' IS NULL; 

no devolvió valores. Parece ser un problema con MyISAM y la misma consulta sobre los datos en InnoDB devolvió los resultados esperados.

Fue con:

SELECT * FROM 'column' WHERE 'column' = ' '; 

Devuelto todos los resultados esperados.



0

Tuve el mismo problema al convertir bases de datos de Access a MySQL (usando vb.net para comunicarse con la base de datos).

Necesitaba evaluar si un campo (campo tipo varchar (1)) era nulo.

Esta declaración funcionó para mi escenario:

SELECT * FROM [table name] WHERE [field name] = ''

1
Si eso funcionó para usted, el valor predeterminado para su varchar (1) es '' en lugar de nulo, por lo tanto, no está relacionado con esta pregunta.
さ り げ な い 告白
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.