CASE WHEN en SQL: sintaxis y ejemplos

La expresión CASE WHEN en SQL añade lógica condicional dentro de una consulta. Sirve para clasificar valores, reemplazar códigos por etiquetas, calcular métricas condicionadas y controlar el orden sin modificar los datos originales.
CASE devuelve un valor. Por eso puede utilizarse en SELECT, ORDER BY, agregaciones y otras expresiones. No es un bucle ni cambia por sí mismo las filas almacenadas.
Sintaxis de CASE WHEN
CASE
WHEN condicion_1 THEN resultado_1
WHEN condicion_2 THEN resultado_2
ELSE resultado_alternativo
END
Las condiciones se evalúan en orden y se devuelve el resultado de la primera verdadera. ELSE es opcional; si se omite y nada coincide, el resultado es NULL.
Crear categorías
SELECT pedido_id,
total,
CASE
WHEN total >= 1000 THEN 'alto'
WHEN total >= 300 THEN 'medio'
ELSE 'bajo'
END AS segmento
FROM pedidos;
El orden es esencial. Si primero escribieras total >= 300, una venta de 1.200 se clasificaría como “medio” y nunca alcanzaría la condición siguiente.
CASE simple y CASE buscado
El CASE simple compara una expresión con valores:
CASE estado
WHEN 'P' THEN 'Pendiente'
WHEN 'E' THEN 'Enviado'
ELSE 'Otro'
END
El CASE buscado admite rangos, combinaciones y operadores:
CASE
WHEN estado = 'P' AND dias_espera > 3 THEN 'Revisar'
WHEN estado = 'P' THEN 'Pendiente'
ELSE 'Sin acción'
END
Usa el primero para equivalencias directas y el segundo para reglas más expresivas.
Agregación condicional
Uno de los usos más valiosos combina CASE con SUM o COUNT:
SELECT region,
SUM(total) AS ventas,
SUM(CASE WHEN canal = 'web' THEN total ELSE 0 END) AS ventas_web,
COUNT(CASE WHEN estado = 'devuelto' THEN 1 END) AS devoluciones
FROM pedidos
GROUP BY region;
COUNT ignora NULL; por eso el CASE sin ELSE cuenta solo los casos que cumplen. Para indicadores 0/1 también puedes sumar:
SUM(CASE WHEN estado = 'devuelto' THEN 1 ELSE 0 END)
Valida que los grupos y agregaciones estén al mismo nivel de detalle que el indicador.
Tratar valores nulos
Una comparación como columna = NULL nunca es verdadera. Usa IS NULL:
CASE
WHEN fecha_entrega IS NULL THEN 'Sin entregar'
WHEN fecha_entrega <= fecha_prometida THEN 'A tiempo'
ELSE 'Con retraso'
END
Para sustituir un nulo simple suele ser más corto COALESCE(columna, valor); CASE es preferible cuando la decisión depende de varias condiciones.
Orden personalizado
SELECT ticket_id, prioridad, creado_en
FROM tickets
ORDER BY
CASE prioridad
WHEN 'urgente' THEN 1
WHEN 'alta' THEN 2
WHEN 'media' THEN 3
ELSE 4
END,
creado_en;
Así el orden responde a una regla de negocio, no al orden alfabético.
CASE dentro de UPDATE
UPDATE productos
SET descuento = CASE
WHEN stock > 500 THEN 0.20
WHEN stock > 200 THEN 0.10
ELSE 0
END;
Esta operación sí modifica datos. Ejecútala primero como SELECT, limita el alcance con WHERE y utiliza una transacción para poder revisar o revertir.
Tipos de datos compatibles
Los resultados de todas las ramas deben poder convertirse a un tipo común. Mezclar números, fechas y texto puede causar errores o conversiones inesperadas. Decide si la salida es una etiqueta, una cantidad o una fecha y mantén consistencia.
Rendimiento y mantenibilidad
CASE es apropiado para reglas pequeñas y cercanas a la consulta. Si tienes decenas de códigos, fechas de vigencia o reglas que cambia el negocio, una tabla de referencia suele ser más auditable. Únela por clave y registra quién mantiene la clasificación.
Evita repetir el mismo CASE en SELECT, GROUP BY y ORDER BY. Puedes calcularlo una vez en una CTE y reutilizar el alias.
Errores frecuentes
- Ordenar condiciones de la menos específica a la más específica.
- Omitir ELSE sin aceptar conscientemente los nulos.
- Comparar con NULL mediante
=. - Usar CASE para corregir permanentemente datos sucios.
- Mezclar tipos incompatibles en THEN.
- Crear categorías solapadas sin pruebas de frontera.
- Duplicar reglas en muchos informes.
Prueba explícitamente los valores límite: justo debajo, exactamente igual y justo encima de cada umbral. Esa pequeña tabla de casos descubre más errores que revisar solo promedios.
Preguntas frecuentes
¿CASE WHEN funciona como IF en SQL?
Cumple una función condicional parecida, pero CASE es una expresión que devuelve un valor dentro de una consulta.
¿CASE se detiene en la primera condición verdadera?
Sí. El orden de las ramas afecta el resultado, sobre todo cuando los rangos o reglas se solapan.
¿Es obligatorio escribir ELSE?
No. Sin ELSE, CASE devuelve NULL cuando ninguna condición coincide. Inclúyelo si necesitas una salida explícita.
¿Puedo usar CASE con SUM?
Sí. SUM(CASE WHEN condición THEN valor ELSE 0 END) es un patrón habitual de agregación condicional.
¿Cómo se compara un nulo dentro de CASE?
Usa IS NULL o IS NOT NULL. La expresión = NULL no devuelve verdadero.
¿CASE modifica los datos de la tabla?
En un SELECT solo calcula una salida. Puede formar parte de UPDATE, donde sí cambia valores y requiere controles transaccionales.

Deja una respuesta