Microsoft SQL Server
NULL
Ricerca…
introduzione
In SQL Server, NULL
rappresenta i dati mancanti o sconosciuti. Ciò significa che NULL
non è realmente un valore; è meglio descritto come un segnaposto per un valore. Questo è anche il motivo per cui non è possibile confrontare NULL
con alcun valore e nemmeno con un altro NULL
.
Osservazioni
SQL Server fornisce altri metodi per gestire i valori null, ad esempio IS NULL
, IS NOT NULL
, ISNULL()
, COALESCE()
e altri.
Confronto NULL
NULL
è un caso speciale quando si tratta di confronti.
Assumi i seguenti dati.
id someVal
----
0 NULL
1 1
2 2
Con una query:
SELECT id
FROM table
WHERE someVal = 1
restituire l'ID 1
SELECT id
FROM table
WHERE someVal <> 1
restituire l'ID 2
SELECT id
FROM table
WHERE someVal IS NULL
restituire l'ID 0
SELECT id
FROM table
WHERE someVal IS NOT NULL
restituire entrambi gli ID 1
e 2
.
Se si desidera che i valori NULL vengano "contati" come valori nel confronto a =
, <>
, è necessario prima convertirli in un tipo di dati numerabile:
SELECT id
FROM table
WHERE ISNULL(someVal, -1) <> 1
O
SELECT id
FROM table
WHERE someVal IS NULL OR someVal <> 1
restituisce 0
e 2
O è possibile modificare l'impostazione ANSI Null .
ANSI NULLI
Da MSDN
In una versione futura di SQL Server, ANSI_NULLS sarà sempre attivo e tutte le applicazioni che impostano esplicitamente l'opzione su OFF genereranno un errore. Evitare l'uso di questa funzione in un nuovo lavoro di sviluppo e pianificare di modificare le applicazioni che attualmente utilizzano questa funzione.
ANSI NULLS
impostato su off consente un confronto =
/ <>
di valori nulli.
Dati i seguenti dati:
id someVal
----
0 NULL
1 1
2 2
E con ANSI NULLS su questa query:
SELECT id
FROM table
WHERE someVal = NULL
non produrrebbe risultati Tuttavia la stessa query, con ANSI NULLS disattivato:
set ansi_nulls off
SELECT id
FROM table
WHERE someVal = NULL
Restituisce id 0
.
È ZERO()
La funzione IsNull()
accetta due parametri e restituisce il secondo parametro se il primo è null
.
parametri:
- controllare l'espressione. Qualsiasi espressione di qualsiasi tipo di dati.
- valore di sostituzione. Questo è il valore che verrebbe restituito se l'espressione di controllo è nullo. Il valore di sostituzione deve essere di un tipo di dati che può essere convertito implicitamente nel tipo di dati dell'espressione di controllo.
La funzione IsNull()
restituisce lo stesso tipo di dati dell'espressione di controllo.
DECLARE @MyInt int -- All variables are null until they are set with values.
SELECT ISNULL(@MyInt, 3) -- Returns 3.
Vedi anche COALESCE
, sopra
È null / Non è nullo
Poiché null non è un valore, non è possibile utilizzare operatori di confronto con valori null.
Per verificare se una colonna o una variabile contiene null, è necessario utilizzare is null
:
DECLARE @Date date = '2016-08-03'
La seguente istruzione selezionerà il valore 6
, poiché tutti i confronti con valori nulli si considerano falsi o sconosciuti:
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
Impostando il contenuto della variabile @Date su null
e riprova, la seguente dichiarazione restituirà 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 ()
Valuta gli argomenti in ordine e restituisce il valore corrente della prima espressione che inizialmente non valuta 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.
Sebbene ISNULL () funzioni in modo simile a COALESCE (), la funzione ISNULL () accetta solo due parametri, uno da verificare e uno da utilizzare se il primo parametro è NULL. Vedi anche ISNULL
, sotto
NULL con NOT IN SubQuery
Durante la gestione non in sub-query con null nella sub-query, è necessario eliminare NULLS per ottenere i risultati attesi
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
Durante la gestione non in sub-query con null, prestare attenzione al risultato previsto