COALESCE (Transact-SQL)
Restituisce la prima espressione non Null tra i relativi argomenti.
Convenzioni della sintassi Transact-SQL
Sintassi
COALESCE ( expression [ ,...n ] )
Argomenti
- expression
Espressione di qualsiasi tipo.
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)