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:

  1. controllare l'espressione. Qualsiasi espressione di qualsiasi tipo di dati.
  2. 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



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow