Condiciones de búsqueda de comparación con NULL

El valor NULL significa que el valor de los datos de la columna no se conoce o no está disponible. NULL no es sinónimo de cero (valor numérico o binario), ni de una cadena de longitud cero ni de valor en blanco (valor de carácter). En su lugar, los valores NULL permiten distinguir entre una entrada con el valor cero (columnas numéricas) o en blanco (columnas de caracteres) y valores sin entrada (NULL tanto para columnas numéricas como de caracteres).

El valor NULL se puede insertar en una columna en la que se permitan valores NULL (según se especifique en la instrucción CREATE TABLE) de dos formas:

  • Si no se introduce ningún dato y no hay un valor predeterminado o una restricción DEFAULT en la columna o el tipo de datos, SQL Server inserta automáticamente el valor NULL.

  • El usuario puede insertar explícitamente el valor NULL al escribir dicho valor sin incluirlo entre comillas. Si la palabra NULL se escribe entre comillas en una columna de caracteres, se trata como las letras N, U, L y L, y no como un valor NULL.

Cuando se recuperan valores NULL, la aplicación muestra normalmente una cadena como NULL, (NULL) o (null) en la posición correspondiente. Por ejemplo, la columna Color de la tabla Product permite valores NULL:

USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL

Comparar valores NULL

Debe tenerse especial cuidado cuando se comparan valores NULL. El comportamiento de la comparación depende de la configuración de la opción SET ANSI_NULLS.

Cuando se establece SET ANSI_NULLS en ON, una comparación en la que al menos una expresión sea NULL no dará como resultado TRUE o FALSE, sino UNKNOWN. Esto se debe a que un valor desconocido no se puede comparar lógicamente con ningún otro valor. Esto ocurre si una expresión se compara con el literal NULL, o si se comparan dos expresiones y una de ellas se evalúa como NULL. Por ejemplo, la siguiente comparación genera siempre UNKNOWN cuando se establece ANSI_NULLS en ON:

ytd_sales > NULL

La siguiente comparación genera también UNKNOWN cada vez que la variable contiene el valor NULL:

ytd_sales > @MyVariable

Use las cláusulas IS NULL o IS NOT NULL para probar un valor NULL. Esto puede hacer más compleja la cláusula WHERE. Por ejemplo, la columna TerritoryID de la tabla Customer de AdventureWorks2008R2 permite valores NULL. Si una instrucción SELECT debe comprobar la existencia de valores NULL además de otros, debe incluir una cláusula IS NULL:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
   OR TerritoryID IS NULL

Transact-SQL admite una extensión que permite que los operadores de comparación devuelvan TRUE o FALSE cuando se comparen con valores NULL. Esta opción se activa al establecer ANSI_NULLS en OFF. Cuando se establece ANSI_NULLS en OFF, las comparaciones como ColumnA = NULL devuelven TRUE cuando ColumnA contiene un valor NULL y FALSE cuando ColumnA contiene algún valor además de NULL. Además, la comparación de dos expresiones que se evalúan como NULL devuelven TRUE. El valor de ANSI_NULLS no afecta a las columnas unidas que contienen NULL. Las filas de columnas unidas que contienen NULL no forman parte del conjunto de resultados. Cuando se establece ANSI_NULLS en OFF, la instrucción SELECT siguiente devuelve todas las filas de la tabla Customer donde Region es un valor NULL:

SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL

Independientemente de la configuración de ANSI_NULLS, los valores NULL se consideran siempre igual con relación a las palabras clave ORDER BY, GROUP BY y DISTINCT. Además, un índice único o una restricción UNIQUE que permita NULL sólo puede contener una fila con un valor de clave NULL. Cualquier fila posterior con NULL será rechazada. Una clave principal no puede tener NULL en ninguna de las columnas que formen parte de la clave.

Los cálculos que implican NULL se evalúan como NULL porque el resultado debe ser UNKNOWN si alguno de los factores es desconocido. Por ejemplo, column1 + 1 se evalúa como NULL si column1 es NULL.

Cuando las columnas que busque incluyan las que permiten valores NULL, podrá buscar valores NULL o distintos de NULL en la base de datos con el siguiente patrón:

WHERE column_name IS [NOT] NULL

Vea también

Referencia

Conceptos