2010-08-21 32 views
185

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

Mi consulta es como la siguiente:

SELECT pid FROM planets WHERE userid = NULL 

Conjunto vacío cada vez.

Muchos lugares dicen que no se almacena como "NULO" o "nulo" en lugar de un valor real, y uno dice que intenta buscar solo un espacio (userid = ' ') pero ninguno de estos ha funcionado. Hubo una sugerencia de 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 por la forma en que podría convertirlo. Me gustaría hacer esto sin tener que volver a crear la tabla como innoDB o cualquier otra cosa, pero si tengo que hacerlo, ciertamente puedo intentarlo.

+1

MyISAM no tiene problemas para almacenar null. La semántica de NULLs debería ser independiente del motor. – MarkR

Respuesta

396

SQL de especial NULL, y que tiene que hacer WHERE field IS NULL, como NULL no puede ser igual a cualquier cosa,

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

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

+22

Desconocido - No es falso. SQL usa tres lógica valorada. –

+36

NULL = NULL no es realmente FALSO - es NULO de nuevo.Pero tampoco es VERDADERO, por lo que IF (NULL = NULL) no se ejecutará. – Konerak

+0

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

45
SELECT pid FROM planets WHERE userid IS NULL 
7

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

1) valores NULL representan los datos que faltan desconocidos.

2) De forma predeterminada, una columna de tabla puede contener valores NULOS.

3) valores NULL son tratados de manera diferente de otros valores

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

5) No es posible poner a prueba para los valores NULL con comparación operadores, como =, <, o <>.

6) Tendremos que utilizar el IS NULL e IS NOT operadores nulo en lugar

Así que en caso de su problema:

SELECT pid FROM planets WHERE userid IS NULL 
+0

Gracias, Minhas es muy útil – webblover

+0

muy útil ... thanx – deemi

28

Como todas las respuestas se dan Quiero añadir poco Más. También me he enfrentado al mismo problema.

¿Por qué falló su consulta? Tiene,

SELECT pid FROM planets WHERE userid = NULL; 

Esto no le dará el resultado esperado, porque a partir de mysql doc

En SQL, el valor NULL nunca es cierto 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.

Énfasis mío.

Para buscar los valores de columna que son NULL, no se puede utilizar una prueba expr = NULL. La siguiente instrucción devuelve ninguna fila, porque expr = NULL no es cierto para cualquier expresión

Solución

SELECT pid FROM planets WHERE userid IS NULL; 

para la prueba de NULL, utilice las IS NULL y IS NOT NULL operadores.

0

que tenían el mismo problema al convertir las bases de datos de Access a MySQL (utilizando vb.net para comunicarse con la base de datos).

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

Esta declaración trabajaban 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 relacionado con esta pregunta. –

5

tenía el mismo problema por el que consulta:

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

no hay ningún valor. Parece ser un problema con MyISAM y la misma consulta sobre los datos en InnoDB arrojó resultados esperados.

Fui con:

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

devuelven todos los resultados esperados.

Cuestiones relacionadas