2012-03-06 12 views
82

Duplicar posibles:
what is “=null” and “ IS NULL”
Is there any difference between IS NULL and =NULLSQL es nulo e = null

¿Cuál es la diferencia entre

where x is null 

y

where x = null 

y ¿por qué este último no funciona?

+7

Como el resultado de cualquier comparación aritmética con NULL también es NULL, no puede obtener ningún resultado significativo de tales comparaciones: http://dev.mysql.com/doc/refman/5.0/en/working-with-null. html – scibuff

Respuesta

90

En SQL, una comparación entre un valor null y cualquier otro el valor (incluido otro null) utilizando un operador de comparación (por ejemplo, =, !=, <, etc.) dará como resultado un null, que se considera como false a los efectos de una cláusula where (estrictamente hablando, es "no cierto", en lugar de "falso", pero el efecto es el mismo).

El razonamiento es que null significa "desconocido", por lo que el resultado de cualquier comparación con un null también es "desconocido". Por lo tanto, no obtendrá ningún hit en las filas codificando where my_column = null.

SQL proporciona la sintaxis especial para las pruebas si una columna es null, a través de is null y is not null, que es una condición especial para la prueba de un null (o no un null).

Aquí hay algunos SQL que muestran una variedad de condiciones y su efecto como se indicó anteriormente.

create table t (x int, y int); 
insert into t values (null, null), (null, 1), (1, 1); 

select 'x = null' as test , x, y from t where x = null 
union all 
select 'x != null', x, y from t where x != null 
union all 
select 'not (x = null)', x, y from t where not (x = null) 
union all 
select 'x = y', x, y from t where x = y 
union all 
select 'not (x = y)', x, y from t where not (x = y); 

devoluciones solamente 1 fila (como se esperaba):

TEST X Y 
x = y 1 1 

ver este corriendo en SQLFiddle

+4

y cómo funciona 'is null'. – joshua

+1

Todavía hay muchos problemas con esta respuesta. "una comparación con nulo siempre se considera falsa", no en la comprobación de restricciones, como ya se señaló, y no en casos especiales, p. 'NULL IS NULL' es una comparación que evaluará a TRUE. "null significa 'desconocido'" - null es un marcador de posición para un valor que debería estar presente pero que por alguna razón falta actualmente y es la aplicación (no el nulo) la que proporciona el significado semántico (desconocido, no se aplica, testigo no respondió, etc.). "si un nulo está en una lista ..." su ejemplo parece involucrar una tabla, no una lista. – onedaywhen

+1

@oneday cuando pensaba que estaba siendo claro ... por "comparación" me refiero a '=' o '! =' Etc, * not * 'IS NULL' o' IS NOT NULL'. FYI el resultado de una selección de una sola columna, tal como se usa en 'IN (SELECT ...)', se llama 'lista' – Bohemian

4

En primer lugar es la correcta manera de comprobar si un valor del campo es null rato después no va a funcionar de la forma esperada debido a que es null gran importancia en que no es igual a nada, por lo que no se puede utilizar comparación de igualdad utilizando para = eso.

Por eso, cuando es necesario comprobar si un valor del campo es null o no, usar:

where x is null 

en lugar de:

where x = null 
51

Es importante señalar, que NULL no es igual a NULL.

NULL no es un valor, y por lo tanto no se puede comparar con otro valor.

where x is null comprueba si x es un valor nulo.

where x = null está comprobando si x es igual a NULL, que nunca va a ser verdad

+1

nulo es un valor, es solo un valor desconocido. Al igual que en los lenguajes de programación, la variable puede tener valor nulo. Además, puedes comparar if (varA! = Null). En sql aunque se trata de manera diferente como usted señaló. – broadband

+0

@broadband: null no es un valor, al igual que el infinito no es un número. Aunque es más una cuestión filosófica ... Sí, puedes asignar "nulo" a una variable, pero eso solo significa que estás desarmando o restableciendo esa variable. 0 o "" sería un valor, pero nulo significa efectivamente "esta variable no tiene valor". – Sygmoral

+0

@Sygmoral internamente cuando escribe en C# string a = null, significa que está estableciendo el valor 'null' en la variable' a'. Pero la interpretación para programador es como dijiste: 'esta variable no tiene valor'. Más aún en sql null puede tener múltiples interpretaciones o lógica de tres valores. – broadband

3

creo que la igualdad es algo que puede ser absolutamente determinado. El problema con null es que es inherentemente desconocido. null combinado con cualquier otro valor es nulo - desconocido. Preguntar a SQL "¿Mi valor es igual a nulo?" Sería desconocido cada vez, incluso si la entrada es nula. Creo que la implementación de IS NULL lo deja en claro.