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.
ISNULL
utilizza il tipo di dati del primo parametro,COALESCE
segue ilCASE
regole di espressione e restituisce il tipo di dati del valore con la precedenza più alta. - La capacità NULL dell'espressione risultante è diversa per
ISNULL
eCOALESCE
. IlISNULL
il valore restituito è sempre considerato NON NULLable (supponendo che il valore restituito non sia nullable). Al contrario,COALESCE
con parametri non nulli è consideratoNULL
. - Convalide per
ISNULL
eCOALESCE
sono anche diversi. Ad esempio, unNULL
valore perISNULL
viene convertito inint
anche se perCOALESCE
, devi fornire un tipo di dati. ISNULL
prende solo due parametri. Al contrarioCOALESCE
accetta un numero variabile di parametri.
Maggiori informazioni
Consulta la documentazione di Microsoft per maggiori dettagli ed esempi più complessi.