Gestire i valori NULL

Completato

Un valore NULL indica nessun valore o un valore sconosciuto. Non indica un valore pari a zero o vuoto e neppure una stringa vuota. Tali valori non sono sconosciuti. È possibile usare un valore NULL per i valori che non sono ancora stati specificati, ad esempio quando un cliente non ha ancora specificato un indirizzo di posta elettronica. Come illustrato in precedenza, è possibile che alcune funzioni di conversione restituiscano un valore NULL anche se un valore non è compatibile con il tipo di dati di destinazione.

Spesso è necessario eseguire passaggi speciali per gestire il valore NULL. NULL è in realtà un non valore. È sconosciuto. Non è uguale né diverso rispetto ad altro. NULL non è maggiore o minore di nulla. Non è possibile definire con precisione cosa siano i valori NULL, ma talvolta è necessario usarli. Fortunatamente, T-SQL offre funzioni per la conversione o la sostituzione dei valori NULL.

ISNULL

La funzione ISNULL accetta due argomenti. Il primo è un'espressione che è attualmente in fase di test. Se il valore del primo argomento è NULL, la funzione restituisce il secondo argomento. Se la prima espressione non è NULL, viene restituita invariata.

Ad esempio, si supponga che la tabella Sales.Customer in un database includa una colonna MiddleName che consente i valori NULL. Quando si esegue una query in questa tabella, anziché la restituzione del valore NULL nel risultato è possibile scegliere che venga restituito un valore specifico, ad esempio "None".

SELECT FirstName,
      ISNULL(MiddleName, 'None') AS MiddleIfAny,
      LastName
FROM Sales.Customer;

I risultati di questa query potrebbero essere simili ai seguenti:

FirstName

MiddleIfAny

LastName

Orlando

N.

Gee

Keith

None

Howard

Donna

F.

Gonzales

...

...

...

Nota

Il tipo di dati del valore sostituito con NULL deve essere lo stesso dell'espressione valutata. Nell'esempio riportato sopra MiddleName è un valore varchar, quindi il valore sostitutivo non può essere numerico. È anche necessario scegliere un valore che non verrà visualizzato nei dati come valore normale. Talvolta può essere difficile trovare un valore che non verrà mai visualizzato nei dati.

Nell'esempio precedente è stato gestito un valore NULL nella tabella di origine, ma è possibile usare ISNULL con qualsiasi espressione che potrebbe restituire NULL, tra cui l'annidamento di una funzione TRY_CONVERT all'interno di una funzione ISNULL.

COALESCE

La funzione ISNULL non è uno standard ANSI, quindi al suo posto si potrebbe preferire usare la funzione COALESCE. COALESCE è un po' più flessibile perché può richiedere un numero variabile di argomenti, ognuno dei quali è un'espressione. Restituisce la prima espressione nell'elenco che non sia NULL.

Se sono presenti solo due argomenti, COALESCE si comporta come ISNULL. Tuttavia, con più di due argomenti, è possibile usare COALESCE come alternativa a un'espressione CASE multipart che usa ISNULL.

Se tutti gli argomenti sono NULL, COALESCE restituisce NULL. Tutte le espressioni devono restituire tipi di dati uguali o compatibili.

La sintassi è la seguente:

SELECT COALESCE ( expression1, expression2, [ ,...n ] )

Nell'esempio seguente viene usata una tabella fittizia denominata HR.Wages, che include tre colonne contenenti informazioni sugli utili settimanali dei dipendenti: la tariffa oraria, il salario settimanale e una provvigione per unità venduta. Un dipendente tuttavia riceve un solo tipo di paga. Per ciascun dipendente, una di queste tre colonne avrà un valore, mentre le altre due saranno NULL. Al fine di determinare l'importo totale corrisposto a ogni dipendente, è possibile usare COALESCE in modo che restituisca solo il valore non NULL trovato in queste tre colonne.

SELECT EmployeeID,
      COALESCE(HourlyRate * 40,
                WeeklySalary,
                Commission * SalesQty) AS WeeklyEarnings
FROM HR.Wages;

I risultati dovrebbero essere simili ai seguenti:

EmployeeID

WeeklyEarnings

1

899,76

2

1.001,00

3

1.298,77

...

...

NULLIF

La funzione NULLIF consente di restituire NULL in determinate condizioni. Questa funzione offre applicazioni utili in aree come la pulizia dei dati, quando si desidera sostituire caratteri vuoti o segnaposto con NULL.

NULLIF accetta due argomenti e restituisce NULL se sono equivalenti. Se non sono uguali, NULLIF restituisce il primo argomento.

Nell'esempio seguente NULLIF sostituisce uno sconto di 0 con un valore NULL. Se non è 0, restituisce il valore dello sconto:

SELECT SalesOrderID,
      ProductID,
      UnitPrice,
      NULLIF(UnitPriceDiscount, 0) AS Discount
FROM Sales.SalesOrderDetail;

I risultati dovrebbero essere simili ai seguenti:

SalesOrderID

ProductID

UnitPrice

Sconto

71.774

836

356,898

NULL

71.780

988

112,998

0,4

71.781

748

818,7

NULL

71.781

985

112,998

0,4

...

...

...

...