Ordenar según el valor de expresiones mostradas en el select

Ordenar usando el valor de algún campo es sencillo. Basta con referirse al nombre del campo en la cláusula order by. Pero cuando el criterio de ordenación no es un campo, sino una expresión (con funciones u operadores) encontráis dificultades para referiros en el order by a esa expresión usada en el select. Aquí explicamos algunas formas de hacerlo.

Una dificultad con la que os encontráis a menudo es utilizar una de las expresiones que se listan en el select para ordenar el resultado de una consulta. Por ejemplo, queremos ordenar el siguiente listado por orden de edad, es decir, usando la misma expresión que aparece en el select en segundo lugar:

select id, 
       truncate(datediff(current_date(), fNac)/365, 0) 
from Persona
order by ?????;

¿Qué podemos poner en el lugar de esas ????? Lo primero que se os suele ocurrir es repetir la misma expresión del select en el order by:

MEJORABLE
select id, 
       truncate(datediff(current_date(), fNac)/365, 0) 
from Persona
order by truncate(datediff(current_date(), fNac)/365, 0);

Funciona. Pero no es necesario, ni eficiente. Se pueden hacer varias cosas:

  • Poner un alias en el select y usarlo en el order by:
    MEJOR
    select id, 
           truncate(datediff(current_date(), fNac)/365, 0) as Edad
    from Persona
    order by Edad;
    
  • Incluso se puede usar un alias con varias palabras, pero en ese caso, si se usa MySQL, en el order by hay que usar OBLIGATORIAMENTE los acentos invertidos para referir al alias
    MEJOR
    select id, 
           truncate(datediff(current_date(), fNac)/365, 0) as 'Edad persona'
    from Persona
    order by `Edad persona`;
    
    ATENCION, esto es importante: en MYSQL, usando un alias con varias palabras, solo funcionan los acentos invertidos. No funcionan ninguna de estas opciones:
    MAL
    order by "Edad persona";
    # o
    order by 'Edad persona';
    
  • Referir al número de orden de la expresión en el select. Como en este ejemplo estamos usando la segunda, podemos poner:
    MEJOR
    select id, 
           truncate(datediff(current_date(), fNac)/365, 0) 
    from Persona
    order by 2;
    

No hay comentarios:

Publicar un comentario