Curso
Cuando se trabaja con datos del mundo real, los valores perdidos son casi inevitables. Tanto si quieres limpiar conjuntos de datos como combinar columnas, SQL te ofrece una solución sencilla pero potente: la función COALESCE()
. Este tutorial te mostrará cómo funciona COALESCE()
, cuándo utilizarlo y cómo aplicarlo mediante ejemplos prácticos, todo ello en unas pocas líneas de SQL.
¿Qué es COALESCE() en SQL?
La función COALESCE()
de SQL devuelve el primer valor no nulo de una lista de expresiones. Si todos los valores son nulos, devuelve null. Se suele utilizar para tratar valores omitidos o combinar varias columnas en una salida de reserva.
¿Cuándo debes utilizar COALESCE()?
Esta función es útil para combinar los valores de varias columnas en una sola.
Por ejemplo, una tabla llamada usuarios contiene los valores de los usuarios work_email
y personal_email
.
Utilizando la función COALESCE()
, podemos crear una columna llamada email, que muestre el work_email
del usuario si no es nulo. De lo contrario, muestra personal_email
.
|
|
|
|
1 |
angel@datacamp.com |
null |
angel@datacamp.com |
2 |
null |
bruce@gmail.com |
bruce@gmail.com |
3 |
cath@datacamp.com |
cath@gmail.com |
cath@datacamp.com |
Sintaxis de COALESCE()
COALESCE(value_1, value_2, ...., value_n)
La función COALESCE()
toma al menos un valor (value_1
). Devolverá el primer valor no nulo de la lista, de izquierda a derecha.
Por ejemplo, primero comprobará si value_1
es nulo. Si no, devuelve value_1
. En caso contrario, comprueba si value_2
es nulo. El proceso continúa hasta completar la lista.
COALESCE()
puede utilizarse con columnas, expresiones o constantes.
Ejemplos prácticos de COALESCE()
Ejecute y edite el código de este tutorial en línea
Ejecutar códigoEjemplo 1: Sustituir null por una constante
Considera la tabla countries
con una lista de países y sus fiestas nacionales. Algunos valores del día nacional son nulos. COALESCE()
rellena los valores que faltan en national_day
con la cadena constante 'Unknown'
.
SELECT
country_id,
name,
national_day,
COALESCE(national_day, 'Unknown') AS national_day_coalesced
FROM countries
ORDER BY country_id
Los resultados son los siguientes:
|
|
|
|
1 |
Aruba |
null |
Desconocido |
2 |
Afganistán |
1919-08-19T00:00:00.000Z |
1919-08-19 |
3 |
Angola |
1975-11-11T00:00:00.000Z |
1975-11-11 |
4 |
Anguilla |
1967-05-30T00:00:00.000Z |
1967-05-30 |
Observa cómo el valor null
de national_day
se sustituye por una constante Unknown
.
Ejemplo 2: Elegir entre dos columnas
Tenemos una tabla llamada products
. Contiene el nombre del producto y su descripción. Algunas descripciones son demasiado largas (más de 60 caracteres). En ese caso, sustituimos la descripción por el nombre del producto.
La siguiente consulta utiliza CASE
para convertir las descripciones largas a NULL
, y luego utiliza COALESCE()
para volver al nombre del producto.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE WHEN
LENGTH(description) >= 60
THEN NULL
ELSE description
END,
product_name) product_name_or_description
FROM products
Los resultados son los siguientes:
product_name |
|
|
G.Skill Ripjaws Serie V |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:14Module:4x16GBSize:64GB" |
G.Skill Ripjaws Serie V |
G.Skill Ripjaws Serie V |
"Speed:DDR4-3200,Type:288-pin DIMM,CAS:15Module:4x16GBSize:64GB" |
G.Skill Ripjaws Serie V |
Asus X99-E-10G WS |
"CPU:LGA2011-3,Factor de forma:SSI CEB,Ranuras RAM:8,RAM máx:128GB" |
"CPU:LGA2011-3,Factor de forma:SSI CEB,Ranuras RAM:8,RAM máx:128GB" |
Supermicro X9SRH-7TF |
"CPU:LGA2011,Factor de forma:ATX,Ranuras RAM:8,RAM máx:64GB" |
"CPU:LGA2011,Factor de forma:ATX,Ranuras RAM:8,RAM máx:64GB" |
Observa cómo la columna product_name_or_description
muestra el product_name
si el description
es largo. De lo contrario, muestra la dirección description
.
Ejemplo 3: Lógica de retroceso con varias columnas
Podemos llevar el ejemplo 2 un paso más allá. Supongamos que actualmente existen dos requisitos:
- Si la longitud de
description
es inferior a 60, muestradescription
. - En caso contrario, comprueba si la longitud de
product_name
es inferior a 20. Si lo es, mostramos la direcciónproduct_name
. - De lo contrario, muestra
product
.
SELECT DISTINCT
product_name,
description,
COALESCE(
CASE
WHEN LENGTH(description) > 50
THEN NULL
ELSE description
END,
CASE
WHEN LENGTH(product_name) > 14
THEN NULL
ELSE product_name
END,
'product') AS product_name_or_description
FROM products
ORDER BY product_name
Los resultados son los siguientes:
|
|
|
ADATA ASU800SS-128GT-C |
Serie:Ultimate SU800,Tipo:SSD,Capacidad:128GB,Caché:N/A |
producto |
ADATA ASU800SS-512GT-C |
Serie:Ultimate SU800,Tipo:SSD,Capacidad:512GB,Caché:N/A |
producto |
AMD 100-5056062 |
Chipset:Vega Frontier Edition Liquid,Memoria:16GBCore Clock:1,5GHz |
producto |
AMD 100-505989 |
Chipset:FirePro W9100,Memoria:32GBReloj del núcleo:930MHz |
Chipset:FirePro W9100,Memoria:32GBReloj del núcleo:930MHz |
Observa cómo la columna product_name_or_description
muestra el product_name
o el description
dependiendo de las longitudes de los product_name
o description
.
Motores SQL compatibles
COALESCE()
funciona en SQL Server (a partir de 2008), Azure SQL Database, Azure SQL Data Warehouse, Parallel Data Warehouse, BigQuery y Amazon RedShift.
Funciones SQL relacionadas
Reflexiones finales
La función COALESCE()
es una herramienta versátil para manejar valores nulos y simplificar tus consultas SQL. Tanto si sustituyes los datos que faltan por valores por defecto como si combinas varias columnas en una, COALESCE()
te ayuda a mantener tu lógica limpia y legible.
¿Listo para profundizar en tus conocimientos de SQL? Echa un vistazo a estos cursos para principiantes y para impulsar tu carrera en DataCamp:
Preguntas frecuentes
¿Qué ocurre si todos los valores de COALESCE() son NULL?
Si cada argumento pasado a la función COALESCE()
es NULL
, la función devolverá NULL
.
¿En qué se diferencia COALESCE() de ISNULL() o IFNULL()?
ISNULL()
(SQL Server) yIFNULL()
(MySQL, SQLite) sólo aceptan dos argumentos.-
COALESCE()
puede aceptar varios argumentos y es más estándar en todos los dialectos de SQL. -
COALESCE()
forma parte de la norma ANSI SQL, mientras queISNULL()
yIFNULL()
son específicos de cada base de datos.
¿Puedo utilizar COALESCE() con expresiones o funciones?
Sí, puedes utilizar nombres de columnas, literales, funciones o expresiones dentro de COALESCE()
.
COALESCE(LOWER(name), 'unknown')
¿Tiene algún coste de rendimiento utilizar COALESCE()?
En general, noCOALESCE()
es eficaz. Sin embargo, si la utilizas con expresiones complejas o dentro de consultas grandes, la base de datos puede evaluar más expresiones de las necesarias, dependiendo de cómo esté escrita.
¿Funciona COALESCE() con distintos tipos de datos?
Sí, pero todos los argumentos deben ser convertibles implícitamente a un tipo de datos común. De lo contrario, puede devolver un error de conversión de tipo dependiendo de tu motor SQL.
¿Puedo anidar funciones COALESCE()?
Sí. Puedes anidarlos, aunque rara vez es necesario porque COALESCE()
ya maneja múltiples argumentos:
COALESCE(col1, COALESCE(col2, 'default'))
Esto equivale a
COALESCE(col1, col2, 'default')