Funciones NVL y COALESCE
Devuelve el valor de la primera expresión que no es nula en una serie de expresiones. Cuando se encuentra un valor que no es nulo, las expresiones restantes de la lista no se evalúan.
NVL es idéntica a COALESCE. Son sinónimos. En este tema se explica la sintaxis y se incluyen ejemplos de ambas funciones.
Sintaxis
NVL( expression, expression, ... )
La sintaxis de COALESCE es la misma:
COALESCE( expression, expression, ... )
Si todas las expresiones son nulas, el resultado es nulo.
Estas funciones son útiles cuando se desea devolver un valor secundario si falta un valor primario o es nulo. Por ejemplo, una consulta puede devolver el primero de los tres números de teléfono disponibles: móvil, fijo o trabajo. El orden de las expresiones de la función determina el orden de evaluación.
Argumentos
- expresión
-
Una expresión, como un nombre de columna, que evalúa estados nulos.
Tipo de retorno
Amazon Redshift determina el tipo de datos del valor devuelto según las expresiones de entrada. Si los tipos de datos de las expresiones de entrada no tienen un tipo común, se devuelve un error.
Ejemplos
Si la lista contiene expresiones de enteros, la función devuelve un entero.
SELECT COALESCE(NULL, 12, NULL);
coalesce
--------------
12
Este ejemplo, que es igual al anterior, excepto que usa NVL, devuelve el mismo resultado.
SELECT NVL(NULL, 12, NULL);
coalesce
--------------
12
En el siguiente ejemplo, se devuelve un tipo de cadena.
SELECT COALESCE(NULL, 'Amazon Redshift', NULL);
coalesce
--------------
Amazon Redshift
En el siguiente ejemplo, se produce un error porque los tipos de datos varían en la lista de expresiones. En este caso, hay un tipo de cadena y un tipo de número en la lista.
SELECT COALESCE(NULL, 'Amazon Redshift', 12);
ERROR: invalid input syntax for integer: "Amazon Redshift"
Para este ejemplo, se crea una tabla con las columnas START_DATE y END_DATE, se insertan filas que incluyan valores nulos y, después, se aplica una expresión NVL a las dos columnas.
create table datetable (start_date date, end_date date);
insert into datetable values ('2008-06-01','2008-12-31');
insert into datetable values (null,'2008-12-31');
insert into datetable values ('2008-12-31',null);
select nvl(start_date, end_date)
from datetable
order by 1;
coalesce
------------
2008-06-01
2008-12-31
2008-12-31
El nombre predeterminado de la columna para una expresión NVL es COALESCE. La siguiente consulta devuelve los mismos resultados:
select coalesce(start_date, end_date)
from datetable
order by 1;
En las siguientes consultas de ejemplo, se crea una tabla con información de ejemplo sobre reservas de hotel y se insertan varias filas. Algunos registros contienen valores nulos.
create table booking_info (booking_id int, booking_code character(8), check_in date, check_out date, funds_collected numeric(12,2));
Inserte los siguientes datos de ejemplo. Algunos registros no tienen fecha check_out
ni cantidad funds_collected
.
insert into booking_info values (1, 'OCEAN_WV', '2023-02-01','2023-02-03',100.00);
insert into booking_info values (2, 'OCEAN_WV', '2023-04-22','2023-04-26',120.00);
insert into booking_info values (3, 'DSRT_SUN', '2023-03-13','2023-03-16',125.00);
insert into booking_info values (4, 'DSRT_SUN', '2023-06-01','2023-06-03',140.00);
insert into booking_info values (5, 'DSRT_SUN', '2023-07-10',null,null);
insert into booking_info values (6, 'OCEAN_WV', '2023-08-15',null,null);
La siguiente consulta devuelve una lista de fechas. Si la fecha de check_out
no está disponible, se muestra la fecha de check_in
.
select coalesce(check_out, check_in)
from booking_info
order by booking_id;
Los resultados son los siguientes. Tenga en cuenta que los dos últimos registros muestran la fecha de check_in
.
coalesce
------------
2023-02-03
2023-04-26
2023-03-16
2023-06-03
2023-07-10
2023-08-15
Si espera que una consulta devuelva valores nulos para determinadas funciones o columnas, puede usar una expresión NVL para reemplazar los valores nulos por algún otro valor. Por ejemplo, funciones de agregación, como SUM, devolverían valores nulos en lugar de ceros cuando no tengan filas para evaluar. Puede usar una expresión NVL para reemplazar esos valores nulos por 700.0
. En lugar de 485
, el resultado de sumar funds_collected
es 1885
porque dos filas que tienen un valor nulo se sustituyen por 700
.
select sum(nvl(funds_collected, 700.0)) as sumresult from booking_info;
sumresult
------
1885