CodeGym /Cursos /SQL SELF /Manejo de NULL en cálculos con COALESCE()

Manejo de NULL en cálculos con COALESCE()

SQL SELF
Nivel 9 , Lección 3
Disponible

Hoy vamos a profundizar otra vez en el tema de manejar NULL y conoceremos una función súper útil — COALESCE(). Esta función te permite lidiar de forma elegante con los valores NULL en tus datos.

Vamos a ver un ejemplo: tienes una tabla con datos de empleados, pero a algunos les falta la info del salario. ¿Qué pasa si intentamos subir todos los salarios? Nada bueno. No se pueden hacer operaciones con NULL. ¿Y si queremos cambiar los salarios NULL por, digamos, 0? Aquí es donde entra en juego COALESCE().

COALESCE() — es una función que devuelve el primer valor que no sea NULL de la lista de argumentos que le pases. Si todos los valores en la lista son NULL, la función devuelve NULL. En otras palabras, es como decir: "¡Dame el primer valor decente que encuentres, porfa!"

Sintaxis

COALESCE(value1, value2, ..., value_n)

value1, value2, ..., value_n — son los argumentos que le pasas a la función. Te va a devolver el primer valor que no sea NULL.

Ejemplos de uso de COALESCE()

Vamos con un par de ejemplos.

Ejemplo 1: Cambiando NULL por 0

Supón que tienes una tabla salaries:

id name salary
1 Otto 50000
2 Maria NULL
3 Alex 60000
4 Anna NULL

Queremos calcular la suma total de los salarios - esto es fácil:

SELECT SUM(salary) AS total_salary
FROM salaries;

La función SUM() ignora los NULL, así que no hay problema.

Pero luego queremos calcular la suma total de salarios si damos a cada empleado un bono de 1000.

SELECT SUM(salary+1000) AS total_salary
FROM salaries;

Y el resultado empieza a fallar. Lo mejor es quitar los valores NULL desde el principio usando la función COALESCE y cambiarlos por 0. Mira cómo hacerlo:

SELECT SUM(COALESCE(salary, 0)) AS total_salary
FROM salaries;

Resultado:

total_salary
110000

Así es mucho mejor y más seguro.

Ejemplo 2: Cambiando NULL por un valor por defecto

Supón que tienes una tabla students con nombres y direcciones:

id name address
1 Anna Kanne
2 Peter NULL
3 Lisa Painful
4 Alex NULL

Queremos cambiar los NULL en las direcciones por "No especificado":

SELECT name, COALESCE(address, 'No especificado') AS resolved_address
FROM students;

Resultado de la consulta:

name resolved_address
Anna Kanne
Peter No especificado
Lisa Painful
Alex No especificado

Ejemplo 3: Usando varios valores

A veces pasa que hay que reemplazar NULL no por un solo valor, sino por varios posibles. Por ejemplo, queremos mostrar el nombre, el nombre de amigos o usar "Sin nombre" si ninguno está puesto. Tabla users:

user_id first_name short_name full_name
1 John Jonny Johnny Walker
2 NULL Pete Peter Kamen
3 NULL NULL

Consulta:

SELECT user_id,
       COALESCE(first_name, short_name, 'Sin nombre') AS display_name
FROM users;

Resultado:

user_id display_name
1 John
2 Pete
3 Sin nombre

Uso práctico de COALESCE()

En la vida real, COALESCE() es como un salvavidas para trabajar con datos que no son perfectos.

Veamos cómo ayuda en diferentes tareas.

Ejemplo 1: Cambiar valores en campos de texto

Tabla original customers:

id name address
1 Alex Lin 123 Maple St
2 Maria Chi NULL
3 Anna Song 456 Oak Ave
4 Otto Art NULL
5 Liam Park 789 Pine Rd

Consulta:

SELECT name, COALESCE(address, 'No especificado') AS address
FROM customers;

Resultado:

name address
Alex Lin 123 Maple St
Maria Chi No especificado
Anna Song 456 Oak Ave
Otto Art No especificado
Liam Park 789 Pine Rd

Ejemplo 2: Preparando datos para informes

Tabla original sales:

id product price
1 Widget A 100
2 Widget B NULL
3 Widget C 250
4 Widget D NULL
5 Widget E 300

Consulta:

SELECT SUM(COALESCE(price, 0)) AS total_sales
FROM sales;

Resultado:

total_sales
650

Errores típicos al usar COALESCE()

Aunque COALESCE() parece una función sencilla y universal, puede tener algunos detalles que te pueden pillar desprevenido.

Incompatibilidad de tipos de datos. Todos los argumentos que le pases a COALESCE() tienen que ser compatibles en tipo de datos. Por ejemplo, no puedes mezclar valores de texto y números.

-- Error
SELECT COALESCE(salary, 'No especificado') FROM employees; 
-- salary — campo numérico, y 'No especificado' — texto.

Ignorar el orden de los argumentos. COALESCE() devuelve el primer valor que no sea NULL, así que el orden de los argumentos importa mucho.

2
Tarea
SQL SELF, nivel 9, lección 3
Bloqueada
Reemplazo de valores NULL por un valor predeterminado
Reemplazo de valores NULL por un valor predeterminado
2
Tarea
SQL SELF, nivel 9, lección 3
Bloqueada
Reemplazo de valores NULL con múltiples niveles de prioridad
Reemplazo de valores NULL con múltiples niveles de prioridad
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION