La ordenación de resultados en una consulta SQL suele ralentizar la respuesta de la consulta, aunque en muchos casos necesitamos tener nuestro resultado ordenado. Hoy me veía con este caso particular, en una aplicación que conecta con una base de datos de SQL-Server: en una pantalla se muestran una serie de líneas de deuda, algunas haciendo referencia a tratamientos ya realizados y otras a tratamientos pendientes. En caso de que estén realizados habría que ordenarlos por fecha de realización, en caso de que no estén realizados sería por fecha de creación.
Para eso podemos utilizar una sentencia CASE en la cláusula ORDER BY:
SELECT
FechaCrea,
Concepto,
Precio,
ImportePagado,
Realizado,
FechaRealizado
FROM
vistaPagos
WHERE
Precio > 0
ORDER BY
CASE Realizado WHEN True THEN FechaRealizado
ELSE FechaCrea END;
Veamos ahora otra posibilidad de uso del CASE: cuando queremos que la consulta reciba un parámetro con el campo por el que ordenar los resultados:
SELECT
FechaCrea,
Concepto,
Precio,
ImportePagado,
Realizado,
FechaRealizado
FROM
vistaPagos
WHERE
Precio > 0
ORDER BY
CASE @OrdenaPor
WHEN 'Fecha' THEN FechaCrea
WHEN 'FReal' THEN FechaRealizado
END,
CASE @OrdenaPor
WHEN 'Precio' THEN Precio
WHEN 'Pendiente' THEN ImportePagado
END
;
¿Por qué hay dos CASE separados en el segundo ejemplo? Bueno, CASE necesita que los tipos devueltos en la expresión sean compatibles. En el primer caso devolverá fechas, en el segundo devolverá importes. En caso de que no se cumpla ninguna de las condiciones devolverá un null, así que no debería hacer fallar la consulta.