COALESCE (Transact-SQL)

Restituisce la prima espressione non Null tra i relativi argomenti.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

COALESCE ( expression [ ,...n ] ) 

Argomenti

Tipi restituiti

Restituisce il tipo di dati di expression con la precedenza del tipo di dati più alta.

Osservazioni

Se tutti gli argomenti sono NULL, COALESCE restituisce NULL.

[!NOTA] Almeno uno dei valori Null deve essere un valore NULL tipizzato.

COALESCE(expression1**,**...n) è equivalente alla funzione CASE seguente:

CASE
   WHEN (expression1 IS NOT NULL) THEN expression1
   ...
   WHEN (expressionN IS NOT NULL) THEN expressionN
   ELSE NULL
END

Le funzioni ISNULL e COALESCE, sebbene equivalenti, possono presentare comportamenti diversi. Un'espressione che include ISNULL con parametri non Null viene considerata NOT NULL, mentre le espressioni che utilizzano COALESCE con parametri non Null vengono considerate NULL. In SQL Server, per indicizzare espressioni che utilizzano COALESCE con parametri non Null è possibile rendere persistente la colonna calcolata utilizzando l'attributo di colonna PERSISTED come indicato nell'istruzione seguente:

CREATE TABLE #CheckSumTest 
(
        ID int identity ,
        Num int DEFAULT ( RAND() * 100 ) ,
        RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
)

Esempi

Nell'esempio seguente viene illustrata una tabella wages che include tre colonne con informazioni sulla retribuzione annua dei dipendenti, ovvero retribuzione oraria, stipendio e commissione. Un dipendente tuttavia riceve un solo tipo di paga. Per determinare l'importo totale pagato a tutti i dipendenti, utilizzare la funzione COALESCE per ottenere solo i valori non Null delle colonne hourly_wage, salary e commission.

SET NOCOUNT ON;
GO
USE master;
IF EXISTS (SELECT name FROM sys.tables
      WHERE name = 'wages')
   DROP TABLE wages;
GO
CREATE TABLE wages
(
   emp_id      tinyint    identity,
   hourly_wage   decimal   NULL,
   salary      decimal    NULL,
   commission   decimal   NULL,
   num_sales   tinyint   NULL
);
GO
INSERT wages VALUES(10.00, NULL, NULL, NULL);
INSERT wages VALUES(20.00, NULL, NULL, NULL);
INSERT wages VALUES(30.00, NULL, NULL, NULL);
INSERT wages VALUES(40.00, NULL, NULL, NULL);
INSERT wages VALUES(NULL, 10000.00, NULL, NULL);
INSERT wages VALUES(NULL, 20000.00, NULL, NULL);
INSERT wages VALUES(NULL, 30000.00, NULL, NULL);
INSERT wages VALUES(NULL, 40000.00, NULL, NULL);
INSERT wages VALUES(NULL, NULL, 15000, 3);
INSERT wages VALUES(NULL, NULL, 25000, 2);
INSERT wages VALUES(NULL, NULL, 20000, 6);
INSERT wages VALUES(NULL, NULL, 14000, 4);
GO
SET NOCOUNT OFF;
GO
SELECT CAST(COALESCE(hourly_wage * 40 * 52, 
   salary, 
   commission * num_sales) AS money) AS 'Total Salary' 
FROM wages;
GO

Set di risultati:

Total Salary 
------------ 
20800.0000
41600.0000
62400.0000
83200.0000
10000.0000
20000.0000
30000.0000
40000.0000
45000.0000
50000.0000
120000.0000
56000.0000

(12 row(s) affected)

Vedere anche

Riferimento

CASE (Transact-SQL)
ISNULL (Transact-SQL)
Funzioni di sistema (Transact-SQL)

Guida in linea e informazioni

Assistenza su SQL Server 2005