SQL · CASE y ordenación

ORDER BY CASE: crear un orden personalizado

Convierte categorías como pendiente, enviado o cancelado en una prioridad explícita sin modificar los datos almacenados.

Lectura: 7–9 minSQL comprobadoPráctica con pistas
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.

Orden personalizado
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

Prioridad por estado
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;
Primeras filas del resultado comprobado en SQLite 3.46.1
idestadofechatotal
118pendiente2025-06-16179,00
114pendiente2025-06-08203,90
111pendiente2025-06-01249,00
109pendiente2025-05-2589,00
105pendiente2025-05-1569,90
102pendiente2025-05-0449,50
117enviado2025-06-14148,90
115enviado2025-06-1024,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 simple
CASE estado
  WHEN 'pendiente' THEN 1
  WHEN 'enviado' THEN 2
  ELSE 3
END

Si la prioridad depende de rangos o de varias columnas, utiliza condiciones completas:

CASE buscado
CASE
  WHEN estado = 'pendiente' AND total >= 200 THEN 1
  WHEN estado = 'pendiente' THEN 2
  ELSE 3
END

Incluye 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

Intermedia · CASE + ORDER BY

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.

Qué debes recordar

  • CASE puede 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 ELSE para categorías nuevas o inesperadas.
  • Si la regla se reutiliza de forma masiva, revisa si merece formar parte del modelo de datos.

Conceptos relacionados

Fuentes técnicas consultadas