Contenido de esta guía
Qué devuelve CASE
CASE es una expresión condicional: produce un valor que puedes mostrar, ordenar, agrupar o utilizar en otro cálculo. No modifica los datos por sí sola.
Las condiciones se evalúan de arriba abajo. Cuando una condición resulta verdadera, se devuelve su valor y las ramas posteriores dejan de ser candidatas para esa fila.
Dos formas habituales
CASE
WHEN condicion_1 THEN resultado_1
WHEN condicion_2 THEN resultado_2
ELSE resultado_alternativo
ENDLa forma buscada permite escribir condiciones distintas. La forma simple compara una expresión con varios valores: CASE estado WHEN 'pagado' THEN ....
Ejemplo guiado: clasificar existencias
SELECT nombre,
stock,
CASE
WHEN stock = 0 THEN 'agotado'
WHEN stock < 10 THEN 'pocas unidades'
ELSE 'disponible'
END AS disponibilidad
FROM productos
ORDER BY stock, nombre
LIMIT 6;| nombre | stock | disponibilidad |
|---|---|---|
| Altavoz | 0 | agotado |
| Portátil Pro | 0 | agotado |
| Monitor 27 | 2 | pocas unidades |
| Monitor 24 | 4 | pocas unidades |
| Teclado | 7 | pocas unidades |
| Disco SSD | 9 | pocas unidades |
La condición stock = 0 debe aparecer antes que stock < 10. De lo contrario, los productos agotados entrarían en la categoría más amplia.
Sin ELSE, CASE devuelve NULL cuando ninguna rama coincide. Esa puede ser la intención, pero conviene decidirlo expresamente.
Errores frecuentes
Ordenar las condiciones de general a específica
CASE
WHEN stock < 10 THEN 'pocas unidades'
WHEN stock = 0 THEN 'agotado'
ENDLa segunda rama nunca clasifica un cero porque la primera ya lo acepta. También evita mezclar resultados incompatibles sin revisar cómo el motor decide el tipo final de la expresión.
Comprueba lo aprendido
Clasifica el importe de los pedidos
Muestra id, total y una columna tramo: 'alto' para totales de 200 o más, 'medio' para totales de 100 o más y 'bajo' para el resto.
ELSE 'bajo'.Solución razonada
SELECT id,
total,
CASE
WHEN total >= 200 THEN 'alto'
WHEN total >= 100 THEN 'medio'
ELSE 'bajo'
END AS tramo
FROM pedidos
ORDER BY id;El orden evita que un pedido de 300 se clasifique como medio antes de comprobar el tramo alto. En la base educativa quedan 5 pedidos en alto, 4 en medio y 9 en bajo.
Compatibilidad entre motores
La expresión CASE está ampliamente disponible. No la confundas con sentencias de control procedural llamadas también CASE en algunos lenguajes almacenados. En una consulta, cada rama debe producir valores que el motor pueda combinar en un tipo de resultado compatible.
Qué debes recordar
CASEdevuelve un valor; no es una tabla ni un filtro por sí solo.- La primera condición verdadera determina el resultado.
- Ordena de la condición más específica a la más general.
- Sin
ELSE, la ausencia de coincidencia produceNULL.
Una aplicación práctica de esta expresión es usar CASE dentro de ORDER BY para definir prioridades que no siguen un orden alfabético o numérico natural.