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.
GO TO FULL VERSION