COALESCE EN MYSQL: CÓMO MANEJAR VALORES NULL DE FORMA ELEGANTE
En el trabajo diario con bases de datos es muy frecuente encontrarse con valores "NULL". Estos representan la ausencia de información y, si no se tratan correctamente, pueden provocar resultados inesperados en consultas, cálculos o reportes. Una de las herramientas más útiles y estándar para gestionar estos casos es la función COALESCE.
COALESCE es una de las funciones más prácticas y limpias para trabajar con valores "NULL" en MySQL, permitiendo escribir consultas más robustas, legibles y fáciles de mantener.
¿Qué es COALESCE?
COALESCE es una función de MySQL, y del estándar SQL, que devuelve el primer valor no nulo de una lista de expresiones. Si todos los argumentos son "NULL", la función también devuelve "NULL". Sintaxis:
COALESCE(expresión1, expresión2, ..., expresiónN)
Evalúa las expresiones de izquierda a derecha y se detiene en la primera que no sea "NULL".
Ejemplos básicos
SELECT COALESCE(NULL, NULL, 'Hola', 'Mundo');
-- Resultado: 'Hola'
SELECT COALESCE(NULL, 1, 2, 3);
-- Resultado: 1
SELECT COALESCE(NULL, NULL, NULL);
-- Resultado: NULL
SELECT COALESCE('Valor existente', 'Valor por defecto');
-- Resultado: 'Valor existente'
Casos de uso más comunes
Sustituir NULL por un valor por defecto
Es el uso más frecuente. Ideal para mostrar textos legibles o valores numéricos en reportes:
SELECT
nombre,
COALESCE(telefono, 'Sin teléfono') AS telefono,
COALESCE(email, 'Sin email') AS email
FROM clientes;
Priorizar varias columnas
Cuando hay varias fuentes posibles de información, por ejemplo, distintos números de teléfono:
SELECT
nombre,
COALESCE(telefono_movil, telefono_fijo, telefono_trabajo, 'Sin contacto') AS contacto
FROM clientes;
Evitar problemas en cálculos
Los valores "NULL", “contaminan” las operaciones aritméticas. Si un descuento es "NULL", el resultado de la resta también será "NULL":
-- Incorrecto (puede devolver NULL)
SELECT precio - descuento AS precio_final FROM productos;
-- Correcto
SELECT precio - COALESCE(descuento, 0) AS precio_final FROM productos;
Combinar con otras funciones
Muy útil junto a funciones de agregación o de texto:
SELECT
titulo,
COALESCE(resumen, LEFT(cuerpo, 150)) AS extracto
FROM articulos;
COALESCE vs IFNULL vs CASE
| Función |
Argumentos |
Estándar SQL |
Uso recomendado |
| "COALESCE" |
2 o más |
Sí |
Prioridad de varios valores o portabilidad |
| "IFNULL" |
Exactamente 2 |
No (solo MySQL) |
Casos simples de dos valores |
| "CASE" |
Flexible |
Sí |
Condiciones más complejas |
Ejemplos de equivalencia
-- Estas dos consultas son equivalentes cuando solo hay dos argumentos
SELECT IFNULL(telefono, 'Sin teléfono') FROM clientes;
SELECT COALESCE(telefono, 'Sin teléfono') FROM clientes;
Cuando necesitas más de dos opciones, COALESCE es claramente superior:sql
-- Con IFNULL habría que anidar (menos legible)
SELECT IFNULL(telefono_movil, IFNULL(telefono_fijo, 'Sin contacto')) FROM clientes;
-- Con COALESCE es limpio
SELECT COALESCE(telefono_movil, telefono_fijo, 'Sin contacto') FROM clientes;
Consejos prácticos
- Usar COALESCE cuando se quiera código portable, funciona igual en PostgreSQL, SQL Server, Oracle, etc.
- Priorizar el uso de "IFNULL" solo si se está 100 % seguro de que nunca se migrará de MySQL y solo se necesitan dos argumentos.
- COALESCE evalúa las expresiones de izquierda a derecha y se detiene en el primer valor no nulo, evaluación corta.
- El tipo de dato del resultado es el tipo “agregado” de los argumentos, MySQL intenta encontrar un tipo compatible.
Ejemplo completo con tabla
Supongamos la tabla empleados:
CREATE TABLE empleados (
id INT PRIMARY KEY,
nombre VARCHAR(100),
salario DECIMAL(10,2),
comision DECIMAL(10,2),
telefono_movil VARCHAR(20),
telefono_fijo VARCHAR(20)
);
Consulta útil:
SELECT
nombre,
COALESCE(salario, 0) + COALESCE(comision, 0) AS ingreso_total,
COALESCE(telefono_movil, telefono_fijo, 'No registrado') AS telefono
FROM empleados;