miércoles, 19 de marzo de 2008

COALESCE

Devuelve la primera expresión distinta de NULL entre sus argumentos.

Sintaxis

COALESCE ( expression [ ,...n ] )

Argumentos

expression:
Es una expresión de cualquier tipo.

Tipos de valor devueltos
Devuelve el tipo de datos de expression con la precedencia de tipo de datos más alta.
Nota: Si todos los argumentos son NULL, COALESCE devuelve NULL.
Al menos uno de los valores NULL debe ser NULL con tipo.

COALESCE(expression1,...n) es equivalente a esta función CASE:

CASE
WHEN (expression1 IS NOT NULL) THEN expression1
...
WHEN (expressionN IS NOT NULL) THEN expressionN
ELSE NULL
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 este ejemplo, la tabla pruebas 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 sólo un tipo de sueldo.
Para determinar el importe total pagado a todos los empleados, utilice la función COALESCE para obtener sólo los valores no NULL encontrados en hourly_wage, salary y commission.


CREATE TABLE pruebas
(
hourly_wage number NULL,
salary number NULL,
commission number NULL,
num_sales int NULL
);

INSERT pruebas VALUES(10.00, NULL, NULL, NULL);
INSERT pruebas VALUES(20.00, NULL, NULL, NULL);
INSERT pruebas VALUES(30.00, NULL, NULL, NULL);
INSERT pruebas VALUES(40.00, NULL, NULL, NULL);
INSERT pruebas VALUES(NULL, 10000.00, NULL, NULL);
INSERT pruebas VALUES(NULL, 20000.00, NULL, NULL);
INSERT pruebas VALUES(NULL, 30000.00, NULL, NULL);
INSERT pruebas VALUES(NULL, 40000.00, NULL, NULL);
INSERT pruebas VALUES(NULL, NULL, 15000, 3);
INSERT pruebas VALUES(NULL, NULL, 25000, 2);
INSERT pruebas VALUES(NULL, NULL, 20000, 6);
INSERT pruebas VALUES(NULL, NULL, 14000, 4);


SELECT CAST(COALESCE(hourly_wage * 40 * 52, salary, commission * num_sales) AS money) AS 'Total Salary'
FROM pruebas;


Éste es el conjunto de resultados.

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)