COALESCE (Transact-SQL)
Devuelve la primera expresión distinta de NULL entre sus argumentos.
Sintaxis
COALESCE ( expression [ ,...n ] )
Tipos de valor devueltos
Devuelve el tipo de datos de expression con la precedencia de tipo de datos más alta. Si ninguna de las expresiones admiten valores NULL, el resultado tiene un tipo que no admite valores NULL.
Notas
Si todos los argumentos son NULL, COALESCE devuelve NULL.
[!NOTA]
Al menos uno de los valores NULL debe ser NULL con tipo.
COALESCE(expression1,...n) es equivalente a la siguiente expresión CASE:
CASE
WHEN (expresión1 IS NOT NULL) THEN expresión1
WHEN (expresión2 IS NOT NULL) THEN expresión2
...
ELSE expresiónN
END
ISNULL y COALESCE, aunque son equivalentes, pueden comportarse de forma diferente. Una expresión que contenga ISNULL con parámetros diferentes de NULL se considera que es NOT NULL, mientras que las expresiones que contienen COALESCE con parámetros que son diferentes de NULL se consideran NULL. En SQL Server, para indizar las expresiones que contienen COALESCE con parámetros distintos de NULL, la columna calculada puede perdurar si se usa el atributo de columna PERSISTED como en la instrucción siguiente:
CREATE TABLE #CheckSumTest
(
ID int identity ,
Num int DEFAULT ( RAND() * 100 ) ,
RowCheckSum AS COALESCE( CHECKSUM( id , num ) , 0 ) PERSISTED PRIMARY KEY
);
Ejemplos
Ejemplo sencillo
En el ejemplo siguiente se muestra cómo COALESCE selecciona los datos de la primera columna que tiene un valor no nulo.
USE AdventureWorks ;
GO
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product ;
GO
Ejemplo complejo
En este ejemplo, la tabla wages incluye tres columnas con información acerca del sueldo anual de los empleados: la tarifa por hora, el salario y la comisión. No obstante, un empleado recibe solo un tipo de sueldo. Para determinar el importe total pagado a todos los empleados, utilice COALESCE para obtener solo los valores no NULL que se encuentran en hourly_wage, salary y commission.
SET NOCOUNT ON;
GO
USE tempdb;
IF OBJECT_ID('dbo.wages') IS NOT NULL
DROP TABLE wages;
GO
CREATE TABLE dbo.wages
(
emp_id tinyint identity,
hourly_wage decimal NULL,
salary decimal NULL,
commission decimal NULL,
num_sales tinyint NULL
);
GO
INSERT dbo.wages (hourly_wage, salary, commission, num_sales)
VALUES
(10.00, NULL, NULL, NULL),
(20.00, NULL, NULL, NULL),
(30.00, NULL, NULL, NULL),
(40.00, NULL, NULL, NULL),
(NULL, 10000.00, NULL, NULL),
(NULL, 20000.00, NULL, NULL),
(NULL, 30000.00, NULL, NULL),
(NULL, 40000.00, NULL, NULL),
(NULL, NULL, 15000, 3),
(NULL, NULL, 25000, 2),
(NULL, NULL, 20000, 6),
(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 dbo.wages
ORDER BY 'Total Salary';
GO
Éste es el conjunto de resultados.
Sueldo total
------------
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 filas afectadas)