Cuando trabajamos con SQL, a veces necesitamos crear condiciones dentro de una misma consulta, similar a un IF-ELSE en programación.
Esto es muy común en reportes, como:
- Clasificar empleados según su rango salarial.
- Mostrar texto en lugar de valores numéricos.
- Aplicar reglas de negocio directamente en la consulta.
Para resolver esto, SQL nos ofrece la cláusula CASE, una herramienta poderosa que permite aplicar lógica condicional sin necesidad de modificar datos en la base.
En este artículo aprenderás:
- Cómo funciona la estructura básica de
CASE. - Ejemplos prácticos aplicados a reportes reales.
- Diferencias entre motores como SQL Server, PostgreSQL y MySQL.
- Buenas prácticas y consideraciones de rendimiento.
Todos los ejemplos podrás ejecutarlos en db-fiddle.com para practicar.
¿Qué es CASE en SQL?
El CASE es una expresión condicional que permite devolver un valor específico dependiendo de ciertas condiciones.
Se parece a un IF-THEN-ELSE y puede usarse en:
- Cláusulas
SELECT(para crear columnas calculadas). - Cláusulas
ORDER BY(para ordenar según reglas personalizadas). - Cláusulas
WHEREyHAVING(para filtrar según lógica condicional).
Sintaxis básica de CASE
Existen dos formas principales:
1. CASE simple (comparación directa con un valor)
CASE columna
WHEN valor1 THEN resultado1
WHEN valor2 THEN resultado2
ELSE resultado_por_defecto
END 2. CASE buscado (con condiciones más flexibles)
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
ELSE resultado_por_defecto
END 💡 El
ELSEes opcional.
Si no se incluye y ninguna condición se cumple,CASEdevuelveNULL.
Datos base para los ejemplos
Utilizaremos las tablas empleados y departamentos definidas previamente:
SELECT * FROM empleados; | id_empleado | nombre | puesto | salario | fecha_contratacion | id_departamento |
|---|---|---|---|---|---|
| 1 | Ana Torres | Gerente de Ventas | 90000 | 2019-01-15 | 1 |
| 2 | Luis Pérez | Ejecutivo de Ventas | 65000 | 2020-03-10 | 1 |
| 3 | Carlos López | Analista Financiero | 60000 | 2021-06-25 | 3 |
| 4 | Marta Díaz | Especialista Marketing | 72000 | 2018-09-05 | 2 |
| 5 | Pedro García | Desarrollador Backend | 80000 | 2022-01-18 | 4 |
| 6 | Sofía Ruiz | Desarrollador Frontend | 80000 | 2022-02-10 | 4 |
| 9 | Raúl Herrera | Auxiliar RH | 40000 | 2021-11-22 | 5 |
Ejemplo 1: Clasificar empleados por rango salarial
Queremos asignar una categoría según el salario:
- Alto: salario ≥ 80,000
- Medio: salario entre 60,000 y 79,999
- Bajo: salario < 60,000
SELECT nombre,
salario,
CASE
WHEN salario >= 80000 THEN 'Alto'
WHEN salario BETWEEN 60000 AND 79999 THEN 'Medio'
ELSE 'Bajo'
END AS categoria_salarial
FROM empleados
ORDER BY salario DESC; Resultado:
| nombre | salario | categoria_salarial |
|---|---|---|
| Ana Torres | 90000 | Alto |
| Pedro García | 80000 | Alto |
| Sofía Ruiz | 80000 | Alto |
| Marta Díaz | 72000 | Medio |
| Luis Pérez | 65000 | Medio |
| Carlos López | 60000 | Medio |
| Raúl Herrera | 40000 | Bajo |
Ejemplo 2: Mostrar texto en lugar de valores NULL
Queremos que, si un empleado no tiene departamento asignado, se muestre “Sin asignar”.
SELECT nombre,
CASE
WHEN id_departamento IS NULL THEN 'Sin asignar'
ELSE CAST(id_departamento AS TEXT)
END AS departamento
FROM empleados; 🔹 En SQL Server podrías usar
CAST(id_departamento AS VARCHAR).
Ejemplo 3: CASE dentro de ORDER BY
Queremos ordenar empleados priorizando:
- Primero los de departamento 4 (
Desarrollo). - Después los demás, ordenados por salario descendente.
SELECT nombre, id_departamento, salario
FROM empleados
ORDER BY
CASE
WHEN id_departamento = 4 THEN 1
ELSE 2
END,
salario DESC; Ejemplo 4: Uso de CASE en WHERE
Queremos filtrar empleados de acuerdo a una condición dinámica:
- Si el departamento es 1 (
Ventas), incluir empleados con salario > 70,000. - En otros departamentos, incluir empleados con salario > 60,000.
SELECT nombre, id_departamento, salario
FROM empleados
WHERE salario >
CASE
WHEN id_departamento = 1 THEN 70000
ELSE 60000
END; Buenas prácticas
- Mantén tus
CASEsimples y claros: demasiadas condiciones dificultan el mantenimiento. - Agrega siempre ELSE: incluso si solo devuelves
NULL, para dejar claro el comportamiento. - Optimiza el orden de las condiciones: las más probables o restrictivas primero.
- Revisa compatibilidad entre motores:
- SQL Server y PostgreSQL permiten usar
CASEen casi cualquier parte de la consulta. - MySQL y SQLite también soportan
CASE, pero asegúrate de los tipos de datos devueltos.
- SQL Server y PostgreSQL permiten usar
Diferencias entre motores
| Motor SQL | Notas importantes |
|---|---|
| SQL Server | Usa VARCHAR en lugar de TEXT. CASE soportado en SELECT, WHERE, ORDER BY. |
| PostgreSQL | Gran flexibilidad. Permite tipos mixtos pero conviene CAST explícito. |
| MySQL | Igual que PostgreSQL, cuidado con el orden de evaluación. |
| SQLite | Muy compatible, perfecto para pruebas. |
Conclusión
El CASE es una herramienta clave para crear lógica condicional dentro de tus consultas SQL.
Te permite construir reportes dinámicos, simplificar reglas de negocio y hacer tus consultas mucho más flexibles.
Practica los ejemplos en db-fiddle.com y empieza a integrarlo en tus reportes diarios.