Microsoft SQL Server
NULLs
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:
- comprobar expresión Cualquier expresión de cualquier tipo de datos.
- 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.