Contenido de esta guía
Respuesta rápida
Usa una expresión CASE dentro de ORDER BY cuando el orden deseado no sea alfabético ni numérico, sino una prioridad del negocio. Cada rama devuelve una clave de orden auxiliar.
ORDER BY CASE estado
WHEN 'pendiente' THEN 1
WHEN 'enviado' THEN 2
WHEN 'cancelado' THEN 3
ELSE 4
END;La consulta no cambia el valor de estado: solo calcula una prioridad temporal para ordenar el resultado.
Modelo mental: convertir categorías en una clave de orden
CASE produce un valor. Como ORDER BY puede ordenar por expresiones, puedes traducir categorías de texto a números que reflejen una prioridad concreta.
El número no necesita mostrarse en la salida. Solo sirve para decidir qué filas aparecen antes.
La prioridad debe tener significado. No escribas una lista arbitraria: documenta por qué «pendiente» va antes que «enviado», o cambia el orden si tu pantalla responde a otra necesidad.
Ejemplo comprobado: pedidos pendientes primero
SELECT id, estado, fecha, total
FROM pedidos
ORDER BY
CASE estado
WHEN 'pendiente' THEN 1
WHEN 'enviado' THEN 2
WHEN 'cancelado' THEN 3
ELSE 4
END,
fecha DESC,
id DESC
LIMIT 8;| id | estado | fecha | total |
|---|---|---|---|
| 118 | pendiente | 2025-06-16 | 179,00 |
| 114 | pendiente | 2025-06-08 | 203,90 |
| 111 | pendiente | 2025-06-01 | 249,00 |
| 109 | pendiente | 2025-05-25 | 89,00 |
| 105 | pendiente | 2025-05-15 | 69,90 |
| 102 | pendiente | 2025-05-04 | 49,50 |
| 117 | enviado | 2025-06-14 | 148,90 |
| 115 | enviado | 2025-06-10 | 24,00 |
Primero se evalúa la prioridad del estado. Después, dentro de cada prioridad, fecha DESC coloca los pedidos más recientes arriba y id DESC resuelve empates.
CASE simple o CASE buscado
Cuando comparas una sola columna con valores concretos, la forma simple suele ser más legible:
CASE estado
WHEN 'pendiente' THEN 1
WHEN 'enviado' THEN 2
ELSE 3
ENDSi la prioridad depende de rangos o de varias columnas, utiliza condiciones completas:
CASE
WHEN estado = 'pendiente' AND total >= 200 THEN 1
WHEN estado = 'pendiente' THEN 2
ELSE 3
ENDIncluye ELSE para categorías inesperadas
Si omites ELSE, una fila que no coincide devuelve NULL como clave de orden. Como la posición predeterminada de NULL cambia entre motores, esa fila puede terminar en un lugar distinto del esperado. Un ELSE explícito evita esa ambigüedad.
Compatibilidad
CASE es una expresión SQL ampliamente disponible y puede utilizarse donde el motor acepte una expresión de orden. PostgreSQL documenta que CASE puede aparecer donde una expresión sea válida; SQLite también permite expresiones arbitrarias en el ORDER BY de un SELECT simple.
La idea es portable, pero no asumas que una expresión compleja será barata en cualquier consulta. Si la prioridad pertenece al modelo de datos y se reutiliza en muchos lugares, puede ser mejor almacenarla o derivarla de una tabla de referencia.
Errores frecuentes
Ordenar solo por el CASE
Varias filas pueden compartir prioridad. Añade fecha, nombre, id u otro criterio coherente para obtener un orden estable dentro de cada grupo.
Convertir una regla de negocio en números mágicos
1, 2 y 3 deben estar acompañados por ramas legibles. No ocultes la intención en una expresión difícil de mantener.
Práctica guiada
Prioriza pedidos para revisión
Ordena los pedidos poniendo primero pendiente, después cancelado y al final enviado. Dentro de cada estado, muestra primero la fecha más reciente y usa id como desempate.
Criterio de éxito: la prioridad de estado se calcula con CASE y los criterios secundarios son explícitos.
fecha DESC.id DESC.Solución razonada
SELECT id, estado, fecha, total
FROM pedidos
ORDER BY
CASE estado
WHEN 'pendiente' THEN 1
WHEN 'cancelado' THEN 2
WHEN 'enviado' THEN 3
ELSE 4
END,
fecha DESC,
id DESC;CASE decide la prioridad principal. La fecha y el identificador determinan el orden dentro de cada prioridad.
Qué debes recordar
CASEpuede producir una clave de orden temporal.- La técnica sirve para prioridades del negocio que no siguen un orden natural.
- Añade criterios secundarios para resolver empates.
- Incluye
ELSEpara categorías nuevas o inesperadas. - Si la regla se reutiliza de forma masiva, revisa si merece formar parte del modelo de datos.