En SQL, la expresión CASE permite realizar comparaciones condicionales dentro de una consulta. Funciona de manera similar a las sentencias IF/ELSE
en lenguajes de programación: evalúa condiciones y devuelve un valor dependiendo del resultado.
CASE
es extremadamente útil cuando queremos transformar valores, clasificar datos o crear columnas calculadas directamente desde la consulta sin modificar los datos almacenados en la tabla.
¿Qué es CASE en SQL?
- Es una expresión condicional que devuelve un valor.
- Se puede usar en
SELECT
,WHERE
,ORDER BY
,GROUP BY
y otras partes de la consulta. - Existen dos formas principales:
- CASE simple: compara un valor con una lista de posibles coincidencias.
- CASE buscado (searched CASE): evalúa condiciones lógicas más complejas.
Sintaxis de CASE
CASE simple
CASE expresión
WHEN valor1 THEN resultado1
WHEN valor2 THEN resultado2
...
ELSE resultado_por_defecto
END
CASE buscado
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
...
ELSE resultado_por_defecto
END
👉 En ambos casos, ELSE
es opcional. Si no se incluye y ninguna condición se cumple, devuelve NULL
.
Ejemplos prácticos de CASE
1. Clasificar valores según condiciones
SELECT nombre,
CASE
WHEN salario > 5000 THEN 'Alto'
WHEN salario BETWEEN 3000 AND 5000 THEN 'Medio'
ELSE 'Bajo'
END AS rango_salarial
FROM empleados;
👉 Clasifica empleados en Alto, Medio o Bajo según su salario (con BETWEEN)
2. CASE simple con valores exactos
SELECT id_pedido,
CASE estado
WHEN 'P' THEN 'Pendiente'
WHEN 'E' THEN 'Enviado'
WHEN 'C' THEN 'Cancelado'
ELSE 'Desconocido'
END AS estado_legible
FROM pedidos;
👉 Traduce códigos de estado (P
, E
, C
) a descripciones legibles.
3. Usar CASE en ORDER BY
SELECT nombre, tipo_cliente
FROM clientes
ORDER BY CASE tipo_cliente
WHEN 'VIP' THEN 1
WHEN 'Regular' THEN 2
ELSE 3
END;
👉 Ordena clientes priorizando a los VIP primero, luego Regulares, después el resto.
4. CASE en cláusulas WHERE
SELECT *
FROM empleados
WHERE CASE
WHEN departamento = 'Ventas' THEN salario
ELSE 0
END > 3000;
👉 Filtra empleados de ventas cuyo salario supere 3000. (Dependiendo del SGBD, puede ser más eficiente usar una condición directa, pero es válido.)
5. CASE combinado con funciones de agregación
SELECT
SUM(CASE WHEN genero = 'M' THEN 1 ELSE 0 END) AS hombres,
SUM(CASE WHEN genero = 'F' THEN 1 ELSE 0 END) AS mujeres
FROM empleados;
👉 Cuenta cuántos hombres y mujeres hay (ejemplo de uso con SUM())
6. CASE en funciones de ventana
SELECT nombre,
salario,
AVG(CASE WHEN departamento = 'IT' THEN salario END)
OVER () AS promedio_it
FROM empleados;
👉 Calcula el salario promedio de IT con AVG() y funciones de ventana.
Diferencias entre CASE simple y CASE buscado
- CASE simple: evalúa igualdad contra un valor.
- CASE buscado: permite condiciones complejas con operadores (
>
,<
,BETWEEN
,LIKE
, etc.).
Ejemplo simple:
CASE estado
WHEN 'A' THEN 'Activo'
WHEN 'I' THEN 'Inactivo'
END
Ejemplo buscado:
CASE
WHEN salario > 5000 THEN 'Alto'
WHEN salario <= 2000 THEN 'Bajo'
ELSE 'Medio'
END
Usos más comunes de CASE
- Transformar códigos en descripciones legibles (ej.:
1 = Activo, 0 = Inactivo
). - Clasificar datos en rangos o categorías.
- Crear métricas personalizadas en reportes (ej.: sumar solo ventas mayores a 100).
- Ordenar resultados personalizados (ej.: priorizar ciertos clientes).
- Contar registros por condición dentro de la misma consulta.
Errores comunes con CASE
- Olvidar el END: cada CASE debe cerrarse con
END
. - Confundirlo con IF: en SQL estándar no existe
IF ... ELSE
, se usa CASE. - No usar ELSE cuando es necesario: puede devolver
NULL
inesperado. - CASE mal anidado: al combinar varios CASE dentro de otro, hay que asegurarse de cerrar cada uno correctamente.
- Esperar que CASE modifique datos: para eso se usan sentencias como UPDATE.
Buenas prácticas al usar CASE
- Usar alias claros en las columnas calculadas (
AS rango
,AS estado_legible
). - Incluir
ELSE
para manejar casos no previstos. - Usar CASE buscado para mayor flexibilidad en condiciones.
- Evitar expresiones demasiado largas dentro de CASE: dividir en subconsultas o vistas.
- Documentar reglas de negocio dentro de la consulta para facilitar mantenimiento.
Ejemplo avanzado: reporte de ventas
SELECT vendedor_id,
SUM(CASE WHEN total >= 1000 THEN total ELSE 0 END) AS ventas_grandes,
SUM(CASE WHEN total < 1000 THEN total ELSE 0 END) AS ventas_pequeñas
FROM ventas
GROUP BY vendedor_id;
👉 Separa el monto vendido en ventas grandes y ventas pequeñas dentro de la misma consulta.
Preguntas frecuentes (FAQ)
1. ¿CASE puede reemplazar a IF en SQL?
Sí. En SQL estándar, CASE
es la forma de manejar condicionales. Algunos motores tienen funciones específicas (IF
, IIF
, DECODE
), pero CASE
es más portable.
2. ¿Puedo usar múltiples CASE en la misma consulta?
Sí, se pueden usar tantos como necesites en SELECT
, WHERE
, ORDER BY
, etc.
3. ¿CASE es compatible con todas las bases de datos?
Sí, forma parte del estándar SQL y funciona en MySQL, PostgreSQL, SQL Server, Oracle y otros.
4. ¿Qué devuelve CASE si ninguna condición se cumple?
Devuelve NULL
, a menos que hayas definido un ELSE
.
5. ¿CASE afecta la performance de la consulta?
Generalmente no de forma significativa, pero expresiones complejas dentro de CASE
pueden ralentizar en tablas muy grandes.
Conclusión
El uso de CASE en SQL es esencial para realizar consultas más dinámicas y expresivas. Permite clasificar, transformar y calcular datos de forma flexible, sin necesidad de modificar la base de datos.
Dominarlo es clave para generar reportes personalizados, métricas complejas y consultas legibles. Con CASE
, podés llevar tus habilidades en SQL a un nivel más profesional.
Explora el uso de CASE
(incluye ejemplos con ventanas) en CASE y funciones de ventana y visita el Glosario SQL completo.