2012-03-07 13 views
22

Tengo una columna llamada CODE en una tabla MySQL que puede ser NULL. Digamos que tengo algunas filas con CODE = 'C' que quiero ignorar en mi conjunto de resultados de selección. Puedo tener CODE = NULL o CODE! = 'C' en mi conjunto de resultados.Comparación MySQL con valor nulo

La siguiente consulta no devuelve una fila con código como NULL:

SELECT * from TABLE where CODE!='C' 

Pero funciona esta consulta como se esperaba y sé que es la forma correcta de hacerlo.

SELECT * from TABLE where CODE IS NULL OR CODE!='C' 

Mi pregunta es por qué tener solo CÓDIGO! = 'C' no devuelve filas donde CODE = NULL? Definitivamente 'C' no es NULO. No estamos comparando ningún valor con un personaje aquí. ¿Alguien puede arrojar algo de luz porque no funciona de esa manera?

+0

posible duplicado de [misterio de MySQL: el valor nulo no es diferente de la cadena no nula] (http://stackoverflow.com/questions/3404766/mysql-mystery-null-value-is-not-different-from- non-null-string) –

Respuesta

33

En MySQL, NULL se considera como un "valor perdido, desconocido", en comparación con ningún valor. Eche un vistazo at this MySQL Reference on NULL.

Cualquier comparación con la aritmética NULL no devuelve verdadero o falso, pero devuelve NULL lugar., Por lo tanto, NULL != 'C' vuelve NULL, en lugar de devolver cierto.

Cualquier comparación aritmética con 'NULL' devolverá falso. Para comprobar esto en SQL:

SELECT IF(NULL=123,'true','false') 

Para comprobar NULL valores que necesitamos para utilizar IS NULL & IS NOT NULL operador.

+4

En todas las bases de datos relacionales, 'null' es un valor perdido desconocido. Nada específico de mysql al respecto. –

+2

Pero 'NULL' es equivalente a' FALSE' en algunas situaciones. Así que puede ser molesto depurar y la solución puede parecer bastante duradera y hackosa. Considera la tabla 'UPDATE SET name =? DONDE id = id Y nombre <>? ' Obviamente, significa actualizar si una actualización podría cambiar algo. Pero si el nombre es nulo, simplemente nunca actualizará la fila.Una parte de los datos faltantes no es igual a algún valor real, por lo que, por supuesto, debe volverse verdadero y funcionar. Quizás los DB necesiten un tipo de valor 'NULL pero TRUE', similar a Perls' 0 pero true'. – Jonathon

+1

@JonathonWisnoski No, su ejemplo no ha cambiado la naturaleza de 'NULL'. Su ejemplo proporciona un caso en el que desea * tratar * 'NULL' lo mismo que un valor no igual. En ese caso, podrías usar 'AND IFNULL (name, 'NOTMYVALUE') <>?' - eso es lo que entiendo, de todos modos. La función 'ISNULL' funciona de esa manera en MSSQL, y creo que' IFNULL' funciona de manera similar. –

11

En SQL, el valor NULL es un valor especial, no comparable con ningún otro. El resultado de una comparación directa con un valor es siempre FALSO o NULO, dependiendo de la implementación.

Para probar un valor nulo, debe usar IS NULL y IS NOT NULL.

+0

A menudo se denomina lógica terciaria. – sceaj

+0

La comparación de 'NULL' con cualquier valor, incluso consigo mismo siempre es' NULL' (o 'UNKNOWN' en algunas implementaciones) pero nunca' FALSE'. ¿Dónde has visto ese comportamiento? –

+0

@ypercube, estoy completamente de acuerdo con usted, pero desafortunadamente tales casos sí existen. Busque por ejemplo en la respuesta aceptada de: http://stackoverflow.com/questions/1843451/why-does-null-null-evaluate-to-false-in-sql-server. y observe "no verdadero" – cornuz

5
SELECT * 
FROM `table_name` 
WHERE IFNULL(`column_name` != 'C', TRUE) 
22

Basado en mis pruebas y la documentación aquí: http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html

Es posible comparar nula y obtener un resultado booleano usando < =>

Por ejemplo:

select x <=> y; 
or 
select @x <=> @y; 

Esto también compara cadena frente a nulo, cadena frente a cadena, etc.

+0

muy buena solución! gracias – opio

2

select * from user donde application_id = '1223333344' y el nombre es nulo;