Lección 3.5: Operador Condicional CASE WHEN ... THEN ... END en SQL
El operador CASE en SQL te permite agregar lógica condicional directamente dentro de una consulta. Puedes usarlo para asignar categorías, devolver etiquetas legibles, filtrar datos con reglas ramificadas y controlar la ordenación personalizada. Es una de las herramientas más prácticas cuando necesitas SQL más inteligente sin mover la lógica al código de la aplicación.
En esta lección, cubriremos:
- cómo funciona
CASE; - cómo usarlo en
SELECT; - cómo aplicar
CASEenWHERE; - cómo construir ordenación personalizada con
CASEenORDER BY.
Sintaxis de CASE
CASE tiene dos formas principales.
1) Forma simple (simple CASE)
CASE expresión
WHEN valor1 THEN resultado1
WHEN valor2 THEN resultado2
ELSE resultado_por_defecto
END
Esta forma compara una expresión (expresión) con múltiples valores.
2) Forma buscada (searched CASE)
CASE
WHEN condición1 THEN resultado1
WHEN condición2 THEN resultado2
ELSE resultado_por_defecto
END
Aquí, cada WHEN contiene una condición completa. Esta forma es más flexible y se usa más comúnmente.
Comportamiento importante:
- las condiciones se evalúan de arriba hacia abajo;
- se devuelve la primera rama
WHENque coincide; - si ninguna condición coincide, se utiliza
ELSE; - si se omite
ELSE, el resultado esNULL.
CASE en SELECT
El caso de uso más común es agregar una columna calculada con una categoría o etiqueta de estado.
Ejemplo: clasificar pagos
SELECT
payment_id,
amount,
CASE
WHEN amount < 2 THEN 'Pago bajo'
WHEN amount BETWEEN 2 AND 6 THEN 'Pago medio'
ELSE 'Pago alto'
END AS nivel_pago
FROM payment
LIMIT 10;
Lo que hace esta consulta:
- evalúa
amountpara cada fila enpayment; - asigna una de tres categorías;
- devuelve la categoría en una nueva columna llamada
nivel_pago.
Ejemplo: estado de alquiler legible
SELECT
rental_id,
rental_date,
return_date,
CASE
WHEN return_date IS NULL THEN 'No devuelto'
ELSE 'Devuelto'
END AS estado_alquiler
FROM rental
LIMIT 10;
Este enfoque es útil en informes y paneles donde los valores en bruto deben mostrarse como estados claros.
CASE en WHERE
Aunque CASE se usa más a menudo en SELECT, también se puede usar para filtrar. Esto es útil cuando las reglas de filtrado dependen de otra columna o necesitan umbrales específicos de rama.
Ejemplo: umbral de cantidad diferente por miembro del personal
SELECT
payment_id,
staff_id,
amount
FROM payment
WHERE amount >= CASE
WHEN staff_id = 1 THEN 5
WHEN staff_id = 2 THEN 3
ELSE 4
END;
Lógica de filtrado:
- para
staff_id = 1, solo se incluyen pagos conamount >= 5; - para
staff_id = 2, solo se incluyen pagos conamount >= 3; - para todos los demás, el umbral es
amount >= 4.
Cuándo una alternativa puede ser mejor
Para condiciones muy simples, OR puede ser más fácil de leer. Pero CASE en WHERE es útil cuando la lógica empresarial realmente se ramifica y debe permanecer en una expresión.
CASE en ORDER BY
Un requisito común es ordenar por prioridad empresarial en lugar de orden alfabético o numérico. CASE es ideal para eso.
Ejemplo: orden de clasificación personalizado para calificaciones de películas
SELECT
title,
rating
FROM film
ORDER BY CASE rating
WHEN 'G' THEN 1
WHEN 'PG' THEN 2
WHEN 'PG-13' THEN 3
WHEN 'R' THEN 4
WHEN 'NC-17' THEN 5
ELSE 6
END,
title;
Resultado: las películas con calificaciones más ligeras aparecen primero, luego las calificaciones más estrictas, independientemente de la ordenación de cadenas por defecto.
Ejemplo: mostrar alquileres no devueltos primero
SELECT
rental_id,
rental_date,
return_date
FROM rental
ORDER BY CASE
WHEN return_date IS NULL THEN 0
ELSE 1
END,
rental_date DESC
LIMIT 20;
Esto te permite colocar los registros más importantes en la parte superior.
Uso Práctico
Segmentación de clientes por gasto:
SELECT customer_id, SUM(amount) AS total_gastado, CASE WHEN SUM(amount) < 50 THEN 'Básico' WHEN SUM(amount) < 100 THEN 'Activo' ELSE 'VIP' END AS segmento_cliente FROM payment GROUP BY customer_id;Contar filas por grupos condicionales:
SELECT SUM(CASE WHEN amount < 2 THEN 1 ELSE 0 END) AS conteo_bajo, SUM(CASE WHEN amount BETWEEN 2 AND 6 THEN 1 ELSE 0 END) AS conteo_medio, SUM(CASE WHEN amount > 6 THEN 1 ELSE 0 END) AS conteo_alto FROM payment;Prioridad de informe personalizada:
SELECT title, replacement_cost FROM film ORDER BY CASE WHEN replacement_cost >= 25 THEN 1 WHEN replacement_cost >= 20 THEN 2 ELSE 3 END, replacement_cost DESC;
Conclusiones Clave de Esta Lección
CASE WHEN ... THEN ... END es una herramienta universal para la lógica condicional en SQL.
Puntos clave:
- en
SELECT, ayuda a construir categorías y estados; - en
WHERE, apoya la lógica de filtrado ramificada; - en
ORDER BY, ofrece control total sobre el orden de clasificación personalizado; - en la mayoría de los casos, incluye
ELSEpara evitar valoresNULLinesperados.
Una vez que domines CASE, tus consultas SQL se volverán más flexibles, más legibles y más cercanas a la lógica empresarial real.