2010-05-01 14 views

Respuesta

6

= NULL se utiliza para la asignación a un valor NULO, mientras que IS NULL se utiliza para determinar si una variable tiene valor NULL.

Ejemplo de sssignment a NULL:

Update TableName Set ColumnName = NULL 

Ejemplo de comparación con un valor NULL en una cláusula condicional (link):

Select * From TableName Where ColumnName is NULL 

ColumnName IS NOT Null también se puede utilizar para asegurarse de que un valor es no NULL

31

En una cláusula WHERE, column=null nunca habrá verdadera, no es válido utilizar null este modo, lo que necesita decir column IS NULL o column IS NOT NULL. Esto habla de la naturaleza especial de NULL, no es un valor para comprobar la igualdad de, es un valor desconocido, por lo que debe utilizar la sintaxis IS o IS NOT.

Puede asignar algo el valor NULL usando = igual. Por ejemplo: UPDATE TableX SET Column=NULL...

enlaces:
Wikipedia NUll (SQL)
w3schools SQL NULL Values
SQL Tutorial, see IS NULL Operator section

+1

¿Respuesta duplicada? –

+0

No "will", pero "should". (Desafortunadamente.) Como muestra ese gigantesco c-n-p de algún otro sitio, al menos un sistema SQL lo dejó funcionar (principalmente). –

+1

Solo para ser técnicamente correcto nulo es la ausencia de un valor, no un valor desconocido. –

14

“= NULL” es una expresión de valor Ahora “es NULL” es el método preferido para evaluar la condición de una variable siendo NULL

Una discusión más detallada sobre la misma cuestión se puede encontrar en el siguiente enlace

http://www.sqlservercentral.com/articles/T-SQL/understandingthedifferencebetweenisnull/871/

No estoy seguro si se puede leer el artículo sin iniciar sesión en el sitio para publicar la copia de la misma aquí

Comprender la diferencia entre "IS NULL" y "= NULL"

Cuando se crea una variable en SQL con la instrucción declare, se crea sin datos y se almacena en tabla de variables (vtable) dentro del espacio de memoria de SQL. El vtable contiene el nombre y la dirección de memoria de la variable. Sin embargo, cuando se crea la variable, no se asigna ninguna dirección de memoria a la variable y, por lo tanto, la variable no se define en términos de memoria.

Cuando establece la variable, se asigna una dirección de memoria y los datos iniciales se almacenan en esa dirección. Cuando vuelve a establecer el valor, los datos en la dirección de memoria apuntada por la variable se cambian al nuevo valor.

Ahora la diferencia y por qué cada uno se comporta de la manera que lo hace.

“= NULL”

“= NULL” es una expresión de valor.Es decir, si la variable se ha configurado y la memoria creada para el almacenamiento de datos tiene un valor. De hecho, una variable puede establecerse en NULL, lo que significa que el valor de los datos de los objetos es desconocido. Si el valor se ha establecido de este modo:

DECLARE @val CHAR(4) 



SET @val = NULL 

Ha configurado explícitamente el valor de los datos a lo desconocido y por lo que cuando lo hace:

If @val = NULL 

Se evaluará como una verdadera expresión.

Pero si lo hago:

DECLARE @val CHAR(4) 



If @val = NULL 

Se evaluará a falso.

La razón para esto es el hecho de que estoy buscando NULL como el valor de @val. Como no he configurado el valor de @val, no se ha asignado ninguna dirección de memoria y, por lo tanto, no existe ningún valor para @val.

Nota: Consulte la sección sobre CONFIGURAR ANSI_NULLS (ON | OFF) debido a las diferencias en los valores predeterminados de SQL 7 y 2000 que hacen que los ejemplos no funcionen. Esto se basa en SQL 7.

“IS NULL”

Ahora “es NULO” es un poco más complicado y es el método preferido para evaluar la condición de un ser NULL variable. Cuando usa la cláusula "IS NULL", comprueba que la dirección de la variable y los datos dentro de la variable son desconocidos. Así que si, por ejemplo, lo hago:

DECLARE @val CHAR(4) 



If @val IS NULL 

      PRINT ‘TRUE’ 

ELSE 

      PRINT ‘FALSE’ 



SET @val = NULL 



If @val IS NULL 

      PRINT ‘TRUE’ 

ELSE 

      PRINT ‘FALSE’ 

Ambas salidas serán VERDADERAS. La razón está en el primer @val IS NULL. Solo he declarado la variable y no se ha establecido ningún espacio de direcciones para los datos, por lo que se comprueba "IS NULL". Y en el segundo, el valor se ha establecido explícitamente en NULL, que también es "IS NULL".

ANSI_NULLS (ON | OFF)

Ahora voy a tirar una torcedura en las obras. En los ejemplos anteriores, ve que = NULL funcionará siempre que el valor esté explícitamente establecido. Sin embargo, cuando SET ANSI_NULLS ON se comportará un poco diferente.

Ej.

DECLARE @val CHAR(4) 



SET @val = NULL 



SET ANSI_NULLS ON 



If @val =NULL 

      PRINT ‘TRUE’ 

ELSE 

      PRINT ‘FALSE’ 



SET ANSI_NULLS OFF 



If @val =NULL 

      PRINT ‘TRUE’ 

ELSE 

      PRINT ‘FALSE’ 

Usted notará la primera vez que se ejecuta la declaración = NULL después de hacer ANSI_NULLS EN se obtiene una FALSO y después de poner en OFF se obtiene una TRUE. La razon es la siguiente.

Extracto del artículo de SQL BOL “SET ANSI_NULLS”

El estándar SQL-92 requiere que un signo igual (=) o no igual a (<>) la comparación con un valor nulo se evalúa como FALSO. Cuando SET ANSI_NULLS está activado, una instrucción SELECT con WHERE column_name = NULL devuelve cero filas, incluso si hay valores nulos en column_name. Una instrucción SELECT utilizando WHERE column_name <> NULL devuelve cero filas incluso si hay valores no nulos en column_name.

Cuando SET ANSI_NULLS está desactivado, los operadores de comparación Igual (=) y No igual a (<>) no siguen el estándar SQL-92. Una instrucción SELECT utilizando WHERE column_name = NULL devuelve las filas con valores nulos en column_name.Una instrucción SELECT utilizando WHERE column_name <> NULL devuelve las filas con valores no nulos en la columna. Además, una instrucción SELECT utilizando WHERE column_name <> XYZ_value devuelve todas las filas que no son valores XYZ y que no son NULL.

Fin Extracto

Así como se define por SQL92, “= NULL” debe siempre evaluar falsa. Así que incluso establecer el valor explícitamente significa que nunca cumplirás con la condición = NULL si y tu código puede no funcionar como se esperaba. La razón más importante por la cual = NULL le disparará en el pie es esto, SQL 7 cuando se envía e instala se predetermina a ANSI_NULL OFF pero SQL 2000 está predeterminado a ANSI_NULL ON. Por supuesto, puede modificar esto de varias maneras, pero si actualizó una base de datos de 7 a 2000 y encontró que = NULL funcionó solo cuando lo configuró de forma explícita cuando despliega un servidor 2000 predeterminado, su código se rompe y puede causar problemas de datos.

Sin embargo, otra razón para utilizar IS NULL es que bajo las pautas de SQL 92 todavía se evaluará como VERDADERO y, por lo tanto, su código es más seguro para actualizar el servidor.

Resumen

Si Resumen menos que necesite para comprobar que el valor de una variable se fija igual a NULL y usted ha establecido ANSI_NULLS ON, a continuación, utilizar siempre la cláusula “IS NULL” para validar si una variable es nulo. Al utilizar = NULL en su lugar, puede causar muchos dolores de cabeza al tratar de solucionar los problemas que puedan surgir de ella, ahora o inesperadamente en el futuro.

Bases

Parte de la información proporcionada proviene de la forma en C++ funciona y cómo se comporta SQL en cada circunstancia. Desafortunadamente, SQL, hasta donde yo sé, no tiene una dirección de función que me permita dar salida a la dirección de memoria real para mostrar lo que ocurre debajo del capó. En C++ cuando se crea una variable, la variable tiene una dirección de 0xddddddd (en depuración, pero también puede tratarse de direcciones diferentes). Cuando configure la variable la primera vez que verifique la dirección, obtendrá una dirección de memoria válida donde se almacenan los datos. Además, se puede obtener más información de SQL Books Online en las secciones sobre IS NULL y SET ANSI_NULLS ....

+0

muchas gracias por su respuesta completa! – user329820

+0

¿Podría explicar más sobre la NOTA que se escribió anteriormente después de la parte "= null"? – user329820

Cuestiones relacionadas