vacios - seleccionar null mysql
MySQL: seleccionando filas donde una columna es nula (8)
Tengo un problema en el que cuando intento seleccionar las filas que tienen un valor NULL para una columna determinada, 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 ve algo como esto:
SELECT pid FROM planets WHERE userid = NULL
Set vacío cada vez.
Se dice que muchos lugares se aseguran de que no se almacene como "NULL" o "null" en lugar de un valor real, y uno dijo que intenta buscar solo un espacio ( userid = '' ''
), pero ninguno de estos ha funcionado. Hubo una sugerencia para 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.
Como todas las respuestas son dadas quiero agregar un poco más. Yo también había enfrentado el mismo problema.
¿Por qué falló tu 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.
Énfasis mío.
Para buscar valores de columna que sean
NULL
, no puede usar una pruebaexpr = NULL
. La siguiente declaración no devuelve filas, porqueexpr = NULL
nunca es verdadero para ninguna expresión
Solución
SELECT pid FROM planets WHERE userid IS NULL;
Para probar NULL
, use los operadores IS NULL
e IS NOT NULL
.
- el operador IS NULL comprueba si un valor es
NULL
. - el operador IS NOT NULL comprueba si un valor no es
NULL
. - Operadores de comparación de MySQL
Información de http://w3schools.com/sql/sql_null_values.asp :
1) Los valores NULL representan datos desconocidos que faltan.
2) De forma predeterminada, una columna de tabla puede contener valores NULL.
3) Los valores NULL se tratan de forma diferente a otros valores
4) No es posible comparar NULL y 0; no son equivalentes.
5) No es posible probar los valores NULL con operadores de comparación, como =, <o <>.
6) Tendremos que usar los operadores IS NULL y IS NOT NOT NULL en su lugar
Así que en caso de su problema:
SELECT pid FROM planets WHERE userid IS NULL
SQL NULL es especial, y tienes que hacer 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 la Rule 3
https://en.wikipedia.org/wiki/Codd%27s_12_rules
También hay un operador <=>
:
SELECT pid FROM planets WHERE userid <=> NULL
Trabajaría. Lo bueno es que <=>
también se puede usar con valores no NULOS:
SELECT NULL <=> NULL
produce 1
.
SELECT 42 <=> 42
produce 1
también.
Consulte aquí: https://dev.mysql.com/doc/refman/5.7/en/comparison-operators.html#operator_equal-to
Tenía el mismo problema donde la consulta:
SELECT * FROM ''column'' WHERE ''column'' IS NULL;
No devolvió valores. Parece ser un problema con MyISAM y la misma consulta en los datos en InnoDB arrojó los resultados esperados.
Fue con:
SELECT * FROM ''column'' WHERE ''column'' = '' '';
Devuelto todos los resultados esperados.
Tuve el mismo problema al convertir bases de datos de Access a MySQL (usando vb.net para comunicarme 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] = ''''
SELECT pid FROM planets WHERE userid IS NULL
SELECT pid FROM planets WHERE userid is null;