Cuando en un SELECT usamos la cláusula ORDER BY le estamos indicando al Firebird en cual orden queremos que las filas sean mostradas. En general ese orden es fijo y ya lo conocemos antes de escribir el SELECT. Sin embargo, en ocasiones no ocurre así sino que el orden de las filas depende de alguna condición.
Ejemplo:
Tenemos una tabla llamada PRODUCTOS la cual tiene las siguientes filas:
Captura 1. Si haces clic en la imagen la verás más grande
Y queremos mostrar a esas filas ordenadas según un criterio muy particular, y no tenemos un índice creado que podamos usar. En este caso, lo que queremos es mostrar primero a todas las filas en cuyo nombre esté «350», luego las filas en cuyo nombre está la palabra «LITRO» y luego las filas en cuyo nombre está la palabra «LITROS».
Resumiendo:
- Primero las filas que tienen «350»
- Después las filas que tienen «LITRO»
- Después las filas que tienen «LITROS»
Con el siguiente SELECT … ORDER BY obtendemos lo que buscamos:
SELECT PRD_IDENTI, PRD_NOMBRE, CASE WHEN PRD_NOMBRE CONTAINING '350' THEN 1 WHEN PRD_NOMBRE CONTAINING 'LITROS' THEN 3 WHEN PRD_NOMBRE CONTAINING 'LITRO' THEN 2 END FROM PRODUCTOS ORDER BY CASE WHEN PRD_NOMBRE CONTAINING '350' THEN 1 WHEN PRD_NOMBRE CONTAINING 'LITROS' THEN 3 WHEN PRD_NOMBRE CONTAINING 'LITRO' THEN 2 END
El primer CASE … END es opcional, no necesitamos escribirlo pero si lo escribimos nos ayuda a entender lo que sucede. El resultado será el siguiente:
Captura 2. Si haces clic en la imagen la verás más grande
Entonces ¿por qué funciona lo que escribimos en la cláusula ORDER BY? porque hemos creado una columna virtual, y las filas se muestran ordenadas según esa columna virtual. O sea, primero todas las que tiene el valor 1, luego las que tienen el valor 2 y finalmente las que tienen el valor 3.
Desde luego que podríamos tener más valores si los necesitamos: 4, 5, 6, 7, …., etc.
¿Y por qué los WHEN que escribimos no están ordenados de menor a mayor?
Porque los caracteres «LITRO» está incluidos dentro de los caracteres «LITROS». Si hubiéramos escrito primero el WHEN que tiene «LITRO» y luego el WHEN que tiene «LITROS» entonces no habríamos obtenido el resultado deseado. ¿Por qué? porque en ese caso «LITROS» habría tenido el valor 2 y no el valor 3, que es el que necesitamos.
Conclusión:
Es importante recordar que podemos mostrar a las filas por cualquier orden que se nos ocurra, y que no es necesario tener un índice para ello, y que la condición puede ser cualquiera. La técnica es crear una columna virtual (la cual por supuesto no es necesario mostrársela a los usuarios) y así las filas serán mostradas según el orden en que las hayamos colocado en esa columna virtual.
En este ejemplo se mostró la columna virtual, pero eso es para que se entienda la técnica, a los usuarios no necesitamos mostrársela.
Artículos relacionados:
Osmar Mitjans
Nov 21, 2014 @ 08:58:12
Excelente.
wrov
Nov 21, 2014 @ 10:46:51
Gracias.
Saludos.
Walter.
cerezocableado
Nov 21, 2014 @ 10:36:35
Hola Walter,
Te recomiendo no crear siquiera la columna virtual, pon el CASE en la zona ORDER BY y listo.
SELECT PRD_IDENTI, PRD_NOMBRE
FROM PRODUCTOS
ORDER BY
CASE
WHEN PRD_NOMBRE CONTAINING ‘350’ THEN 1
WHEN PRD_NOMBRE CONTAINING ‘LITROS’ THEN 3
WHEN PRD_NOMBRE CONTAINING ‘LITRO’ THEN 2
ELSE 4
END
En el caso de necesitar la columna virtual, en el order pon mejor un alias o la posición que ocupa, te puedes llevar sorpresas si no tienes ambas sentencias iguales.
Saludos.
wrov
Nov 21, 2014 @ 10:46:05
Como bien lo dice el artículo la columna virtual es opcional y fue colocada solamente para que los lectores de este artículo entiendan mejor lo que ocurre. No se necesita de un alias ni de una posición porque lo que se usa es lo escrito a continuación de la cláusula ORDER BY. Si eso está correcto, que al usuario se le muestre una columna virtual con otros valores no influirá en el resultado final. No es lo recomendable, desde luego, pero no influirá en el resultado buscado.
Saludos.
Walter.
juan carlos ramirez
Nov 21, 2014 @ 15:17:25
Interesante, esta opción puede ser muy útil
gracias walter.
wrov
Nov 21, 2014 @ 15:37:05
Sí, realmente a veces es muy útil porque nos ahorramos de agregarle una columna a la tabla, el ordenamiento lo hacemos mediante una columna virtual. Obtenemos el mismo resultado y sin desperdiciar espacio en el disco duro.
Saludos.
Walter.
ejgtuc
Nov 21, 2014 @ 18:52:45
Buen articulo Walter, muy practico.
wrov
Nov 21, 2014 @ 19:35:22
Gracias.
Saludos.
Walter.