Buscar..


Introducción

En SQL Server, NULL representa datos que faltan o son desconocidos. Esto significa que NULL no es realmente un valor; Se describe mejor como un marcador de posición para un valor. Esta es también la razón por la que no puede comparar NULL con ningún valor, y ni siquiera con otro NULL .

Observaciones

SQL Server proporciona otros métodos para manejar nulos, como IS NULL , IS NOT NULL , ISNULL() , COALESCE() y otros.

Comparación nula

NULL es un caso especial cuando se trata de comparaciones.

Supongamos los siguientes datos.

id someVal
 ----
 0 NULL
 1 1
 2 2

Con una consulta:

 SELECT id
 FROM table
 WHERE someVal = 1

volvería id 1

 SELECT id
 FROM table
 WHERE someVal <> 1

volvería id 2

 SELECT id
 FROM table
 WHERE someVal IS NULL

devolvería id 0

 SELECT id
 FROM table
 WHERE someVal IS NOT NULL

devolvería ambos identificadores 1 y 2 .

Si desea que los NULL se "cuenten" como valores en una comparación = , <> , primero se deben convertir a un tipo de datos contables:

 SELECT id
 FROM table
 WHERE ISNULL(someVal, -1) <> 1

O

 SELECT id
 FROM table
 WHERE someVal IS NULL OR someVal <> 1

devuelve 0 y 2

O puede cambiar la configuración de ANSI Null .

ANSI NULLS

Desde MSDN

En una versión futura de SQL Server, ANSI_NULLS siempre estará ENCENDIDO y cualquier aplicación que establezca explícitamente la opción en APAGADO generará un error. Evite usar esta función en nuevos trabajos de desarrollo y planee modificar las aplicaciones que actualmente usan esta función.

ANSI NULLS en off permite una comparación = / <> de valores nulos.

Teniendo en cuenta los siguientes datos:

id someVal
 ----
 0 NULL
 1 1
 2 2

Y con ANSI NULLS en, esta consulta:

 SELECT id
 FROM table
 WHERE someVal = NULL

no produciría resultados Sin embargo, la misma consulta, con ANSI NULLS desactivado:

 set ansi_nulls off

 SELECT id
 FROM table
 WHERE someVal = NULL

Volvería id 0 .

ES NULO()

La función IsNull() acepta dos parámetros y devuelve el segundo parámetro si el primero es null .

Parámetros:

  1. comprobar expresión Cualquier expresión de cualquier tipo de datos.
  2. Valor de reposición. Este es el valor que se devolvería si la expresión de verificación es nula. El valor de reemplazo debe ser de un tipo de datos que pueda convertirse implícitamente al tipo de datos de la expresión de verificación.

La función IsNull() devuelve el mismo tipo de datos que la expresión de verificación.

DECLARE @MyInt int -- All variables are null until they are set with values.

SELECT ISNULL(@MyInt, 3) -- Returns 3.

Ver también COALESCE , arriba.

Es nulo / no es nulo

Dado que nulo no es un valor, no puede usar operadores de comparación con nulos.
Para verificar si una columna o variable tiene un valor nulo, debe usar is null :

DECLARE @Date date = '2016-08-03'

La siguiente declaración seleccionará el valor 6 , ya que todas las comparaciones con valores nulos se evalúan como falsas o desconocidas:

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

Al establecer el contenido de la variable @Date en null y volver a intentarlo, la siguiente declaración devolverá 5 :

SET @Date = NULL -- Note that the '=' here is an assignment operator!

SELECT CASE WHEN @Date = NULL THEN 1
            WHEN @Date <> NULL THEN 2
            WHEN @Date > NULL THEN 3
            WHEN @Date < NULL THEN 4
            WHEN @Date IS NULL THEN 5
            WHEN @Date IS NOT NULL THEN 6

COALESCE ()

COALESCE () Evalúa los argumentos en orden y devuelve el valor actual de la primera expresión que inicialmente no se evalúa como NULL .

DECLARE @MyInt int -- variable is null until it is set with value.
DECLARE @MyInt2 int -- variable is null until it is set with value.
DECLARE @MyInt3 int -- variable is null until it is set with value.

SET @MyInt3  = 3

SELECT COALESCE (@MyInt, @MyInt2 ,@MyInt3 ,5) -- Returns 3 : value of @MyInt3.

Aunque ISNULL () funciona de manera similar a COALESCE (), la función ISNULL () solo acepta dos parámetros: uno para verificar y otro para usar si el primer parámetro es NULL. Ver también ISNULL , abajo.

NULL con NOT IN SubQuery

Si bien el manejo no se realiza en subconsulta con nulo en la subconsulta, debemos eliminar NULLS para obtener los resultados esperados.

create table #outertable (i int)
create table #innertable (i int)

insert into #outertable (i) values (1), (2),(3),(4), (5)
insert into #innertable (i) values (2), (3), (null)

select * from #outertable where i in (select i from #innertable)
--2
--3
--So far so good

select * from #outertable where i not in (select i from #innertable)
--Expectation here is to get 1,4,5 but it is not. It will get empty results because of the NULL it executes as {select * from #outertable where i not in (null)}

--To fix this 
select * from #outertable where i not in (select i from #innertable where i is not null)
--you will get expected results
--1
--4
--5

Si bien el manejo no está en sub-consulta con nulo, tenga cuidado con el resultado esperado.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow