Condizioni di ricerca per confronti di valori Null
Un valore Null corrisponde a un valore di una colonna sconosciuto o non disponibile. NULL non è un sinonimo di zero (valore numerico o binario), stringa di lunghezza zero o valore vuoto (valore del carattere). I valori Null consentono di distinguere tra una voce uguale a zero (colonne numeriche) o vuota (colonne di tipo carattere) e una voce non disponibile (NULL per colonne sia numeriche che di tipo carattere).
I valori Null possono essere inseriti in una colonna che supporta i valori Null (in base a quanto indicato nell'istruzione CREATE TABLE) in due modi diversi:
In SQL Server il valore NULL viene inserito automaticamente se non viene inserito alcun dato e se non esiste alcun vincolo predefinito o DEFAULT per la colonna o il tipo di dati.
In modo esplicito dall'utente specificando NULL senza virgolette. La parola NULL tra virgolette in una colonna di tipo carattere viene interpretata come gruppo di lettere (N, U, L e L) anziché come valore Null.
Quando vengono recuperati valori Null, nelle applicazioni viene in genere visualizzata la stringa NULL, (NULL) o (null) nella posizione appropriata. La colonna Color della tabella Product, ad esempio, supporta i valori Null:
USE AdventureWorks2008R2;
GO
SELECT ProductID, Name, Color
FROM AdventureWorks2008R2.Production.Product
WHERE Color IS NULL
Confronto di valori Null
I confronti di valori Null devono essere eseguiti con la massima cautela. Il confronto viene eseguito in modo diverso a seconda dell'impostazione dell'opzione SET ANSI_NULLS.
Se l'opzione SET ANSI_NULLS è impostata su ON, un confronto in cui una o più espressioni sono NULL non restituisce TRUE o FALSE, ma UNKNOWN in quanto un valore sconosciuto non può essere confrontato logicamente con nessun altro valore. Ciò si verifica nei confronti tra un'espressione e il valore letterale NULL e nei confronti tra due espressioni di cui una restituisce NULL. Se, ad esempio, l'opzione ANSI_NULLS è impostata su ON, il confronto seguente restituisce sempre UNKNOWN:
ytd_sales > NULL
Il confronto seguente restituisce inoltre UNKNOWN ogni volta che la variabile include il valore Null:
ytd_sales > @MyVariable
Per verificare la presenza di un valore Null, utilizzare la clausola IS NULL o IS NOT NULL. La clausola WHERE potrebbe risultare in tal modo più complessa. Ad esempio, la colonna TerritoryID della tabella AdventureWorks2008R2Customer supporta valori Null. Un'istruzione SELECT che oltre ad altri valori deve verificare i valori Null deve includere la clausola IS NULL:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID IN (1, 2, 3)
OR TerritoryID IS NULL
Transact-SQL supporta un'estensione grazie alla quale gli operatori di confronto possono restituire TRUE o FALSE anche se uno dei termini di confronto è un valore Null. Questa opzione viene attivata impostando ANSI_NULLS su OFF. Se l'opzione ANSI_NULLS è impostata su OFF, i confronti del tipo ColumnA = NULL restituiscono TRUE se ColumnA include un valore Null, FALSE se ColumnA include altri valori oltre a NULL. Restituisce TRUE anche il confronto tra due espressioni che restituiscono NULL. L'impostazione ANSI_NULLS non influisce sulle colonne unite in join che contengono valori NULL. Le righe di colonne unite in join che contengono NULL non fanno parte del set di risultati. Quando l'opzione ANSI_NULLS è impostata su OFF, l'istruzione SELECT seguente restituisce tutte le righe della tabella Customer in cui Region è un valore Null:
SELECT CustomerID, AccountNumber, TerritoryID
FROM AdventureWorks2008R2.Sales.Customer
WHERE TerritoryID = NULL
Con le parole chiave ORDER BY, GROUP BY e DISTINCT, i valori Null vengono sempre considerati equivalenti, indipendentemente dall'impostazione dell'opzione ANSI_NULLS. Inoltre, un indice univoco o un vincolo UNIQUE che supporta valori Null può includere una sola riga con un valore di chiave Null. Le righe successive contenenti valori Null vengono ignorate. Una chiave primaria non può includere valori Null in nessuna colonna.
I calcoli che includono valori Null restituiscono NULL in quanto, in presenza di un fattore sconosciuto, il risultato deve essere UNKNOWN. Ad esempio, column1 + 1 restituisce NULL se column1 è NULL.
Se alcune colonne in cui viene eseguita la ricerca supportano valori Null, è possibile trovare i valori Null o non Null del database utilizzando la sintassi seguente:
WHERE column_name IS [NOT] NULL