In SQL Server, il COALESCE() espressione restituisce il suo primo argomento non nullo.
Il modo in cui funziona è passare un elenco di argomenti all'espressione, valutare gli argomenti in ordine e restituire il valore corrente della prima espressione che inizialmente non restituisce NULL .
Sintassi
La sintassi è questa:
COALESCE ( expression [ ,...n ] ) Esempio
Ecco un semplice esempio da dimostrare:
SELECT COALESCE(null, 'Cat', 'Dog'); Risultato:
Cat
In questo caso, Cat era il primo argomento non NULL, quindi COALESCE() restituito quel valore.
Espressioni
Come accennato, COALESCE() restituisce il valore corrente della prima espressione che inizialmente non restituisce NULL . Pertanto, se passiamo un'espressione come questa:
SELECT COALESCE( null, 2 * 3 ); Otteniamo questo:
6
La funzione restituisce il tipo di dati dell'espressione con la precedenza del tipo di dati più alta. Se tutte le espressioni non possono essere annullate, il risultato viene digitato come non annullabile.
Quando tutti gli argomenti sono NULL
Se tutti gli argomenti sono NULL , COALESCE() restituisce NULL . Tuttavia, almeno uno dei valori null deve essere un NULL digitato , altrimenti si verifica un errore.
In altre parole, non possono essere tutti NULL costante:
SELECT COALESCE( null, null ); Otteniamo questo:
Msg 4127, Level 16, State 1, Line 1 At least one of the arguments to COALESCE must be an expression that is not the NULL constant.
In questo caso, tutti gli argomenti erano NULL costante, quindi è stato restituito un errore.
Di seguito è riportato un esempio di database per dimostrare uno scenario in cui COALESCE() restituisce NULL quando tutti gli argomenti sono NULL .
Supponiamo di eseguire la seguente query:
SELECT CustomerId, CustomerCategoryId
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Risultato:
CustomerId CustomerCategoryId ----------- ------------------ NULL NULL
Entrambe le colonne contengono NULL valori.
Quindi, se passiamo entrambe le colonne a COALESCE() , otteniamo un risultato di NULL :
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Risultato:
NULL
Lo stesso vale se sostituiamo una delle colonne con NULL costante:
SELECT COALESCE( CustomerId, null )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Risultato:
NULL
Quindi è solo quando tutti gli argomenti sono NULL costante che otteniamo un errore.
Sostituisci NULL Risultati con un valore noto
Possiamo includere un valore noto come ultimo argomento per sostituire qualsiasi risultato NULL con quel valore noto.
Ad esempio, la query seguente restituisce NULL :
SELECT SUM( UnitPrice )
FROM Sales.SpecialDeals; Risultato:
NULL
In questo caso, il UnitPrice la colonna contiene valori NULL in tutte le righe, quindi il risultato è stato NULL .
Possiamo usare COALESCE() così:
SELECT COALESCE( SUM( UnitPrice ), 0 )
FROM Sales.SpecialDeals; Risultato:
0.00
Ora, il risultato NULL viene sostituito con un valore noto (zero).
COALESCE() rispetto a CASE
Il COALESCE() espressione è in realtà una scorciatoia sintattica per il CASE espressione. Quando utilizziamo il COALESCE() espressione, Query Optimizer la riscrive come CASE espressione.
Quando eseguo la seguente istruzione:
SELECT COALESCE( CustomerId, CustomerCategoryId )
FROM Sales.SpecialDeals
WHERE SpecialDealId = 1; Query Optimizer lo riscrive come segue:
CASE
WHEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID] IS NOT NULL THEN [WideWorldImporters].[Sales].[SpecialDeals].[CustomerID]
ELSE [WideWorldImporters].[Sales].[SpecialDeals].[CustomerCategoryID]
END COALESCE() rispetto a ISNULL()
In un certo senso, il COALESCE() l'espressione è simile a ISNULL() funzione. Ma ci sono differenze. In particolare:
ISNULL()è una funzione e viene valutata una sola volta.COALESCE()d'altra parte, è un'espressione e potenzialmente può essere valutata più volte.- La determinazione del tipo di dati dell'espressione risultante è diversa.
ISNULLutilizza il tipo di dati del primo parametro,COALESCEsegue ilCASEregole di espressione e restituisce il tipo di dati del valore con la precedenza più alta. - La capacità NULL dell'espressione risultante è diversa per
ISNULLeCOALESCE. IlISNULLil valore restituito è sempre considerato NON NULLable (supponendo che il valore restituito non sia nullable). Al contrario,COALESCEcon parametri non nulli è consideratoNULL. - Convalide per
ISNULLeCOALESCEsono anche diversi. Ad esempio, unNULLvalore perISNULLviene convertito inintanche se perCOALESCE, devi fornire un tipo di dati. ISNULLprende solo due parametri. Al contrarioCOALESCEaccetta un numero variabile di parametri.
Maggiori informazioni
Consulta la documentazione di Microsoft per maggiori dettagli ed esempi più complessi.