Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Spiegazione di SQL Server COALESCE()

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 il CASE 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 e COALESCE . Il ISNULL il valore restituito è sempre considerato NON NULLable (supponendo che il valore restituito non sia nullable). Al contrario,COALESCE con parametri non nulli è considerato NULL .
  • Convalide per ISNULL e COALESCE sono anche diversi. Ad esempio, un NULL valore per ISNULL viene convertito in int anche se per COALESCE , devi fornire un tipo di dati.
  • ISNULL prende solo due parametri. Al contrario COALESCE accetta un numero variabile di parametri.

Maggiori informazioni

Consulta la documentazione di Microsoft per maggiori dettagli ed esempi più complessi.