Order By (u Order)

La instrucción order ordena un array de nid, rid u objetos JSON y devuelve ese mismo array ordenado. La palabra clave by puede acompañar opcionalmente a order.

Ejemplo:

(select Customer order 'First name').'first name'

Ordenar textos

Los textos se ordenan según el código ASCII. Las mayúsculas y las minúsculas tienen valores distintos, igual que los caracteres acentuados.
Para una ordenación alfabética conviene usar la función upper() para pasar el texto a mayúsculas antes de ordenar:

(select Customer order upper('First name')).text('first name')

Nota: la función upper() no elimina los acentos, solo pasa los caracteres a mayúsculas. Por tanto, este método solo funciona en parte para la ordenación alfabética.
Para tratar los acentos por completo hace falta una función propia que los elimine:

Función de eliminación de acentos:

function SansAccent(S : text) do
  S := replacex(S, "Ç|Ć", "g", "C");
  S := replacex(S, "ç", "g", "c");
  S := replacex(S, "è|é|ê|ë", "g", "e");
  S := replacex(S, "È|É|Ê|Ë", "g", "E");
  S := replacex(S, "à|á|â|ã|ä|å", "g", "a");
  S := replacex(S, "@|À|Á|Â|Ã|Ä|Å", "g", "A");
  S := replacex(S, "ì|í|î|ï", "g", "i");
  S := replacex(S, "Ì|Í|Î|Ï", "g", "I");
  S := replacex(S, "ð|ò|ó|ô|õ|ö", "g", "o");
  S := replacex(S, "Ò|Ó|Ô|Õ|Ö", "g", "O");
  S := replacex(S, "ù|ú|û|ü", "g", "u");
  S := replacex(S, "Ù|Ú|Û|Ü", "g", "U");
  S := replacex(S, "ý|ÿ", "g", "y");
  S := replacex(S, "Ý", "g", "Y");
  S
end;

(select Customer order SansAccent(upper('First name'))).text('first name')

Orden ascendente y descendente

El orden predeterminado es ascendente (de menor a mayor).
Para ordenar de forma descendente, el método depende del tipo de valor:

Para valores numéricos:

Puede usar el signo menos (-):

(select Invoice order -'Invoice Date').text('Invoice Date')

Para textos:

No existe ninguna función integrada para invertir un texto: hay que crearla. A continuación hay un ejemplo que trata los 256 caracteres ASCII, recorriendo cada carácter e invirtiendo su valor:

Función de inversión de texto:

function reverseAscii(t : text) do
  var ascii := urlDecode("%C3%BF%C3%BE%C3%BD%C3%BC%C3%BB%C3%BA%C3%B9%C3%B8%C3%B7%C3%B6%C3%B5%C3%B4%C3%B3%C3%B2%C3%B1%C3%B0%C3%AF%C3%AE%C3%AD%C3%AC%C3%AB%C3%AA%C3%A9%C3%A8%C3%A7%C3%A6%C3%A5%C3%A4%C3%A3%C3%A2%C3%A1%C3%A0%C3%9F%C3%9E%C3%9D%C3%9C%C3%9B%C3%9A%C3%99%C3%98%C3%97%C3%96%C3%95%C3%94%C3%93%C3%92%C3%91%C3%90%C3%8F%C3%8E%C3%8D%C3%8C%C3%8B%C3%8A%C3%89%C3%88%C3%87%C3%86%C3%85%C3%84%C3%83%C3%82%C3%81%C3%80%C2%BF%C2%BE%C2%BD%C2%BC%C2%BB%C2%BA%C2%B9%C2%B8%C2%B7%C2%B6%C2%B5%C2%B4%C2%B3%C2%B2%C2%B1%C2%B0%C2%AF%C2%AE%C2%AD%C2%AC%C2%AB%C2%AA%C2%A9%C2%A8%C2%A7%C2%A6%C2%A5%C2%A4%C2%A3%C2%A2%C2%A1%C2%A0%C2%9F%C2%9E%C2%9D%C2%9C%C2%9B%C2%9A%C2%99%C2%98%C2%97%C2%96%C2%95%C2%94%C2%93%C2%92%C2%91%C2%90%C2%8F%C2%8E%C2%8D%C2%8C%C2%8B%C2%8A%C2%89%C2%88%C2%87%C2%86%C2%85%C2%84%C2%83%C2%82%C2%81%C2%80%7F~%7D%7C%7Bzyxwvutsrqponmlkjihgfedcba%60_%5E%5D%5C%5BZYXWVUTSRQPONMLKJIHGFEDCBA@?%3E=%3C;:9876543210/.-,+*)('&%25$#%22!%20%1F%1E%1D%1C%1B%1A%19%18%17%16%15%14%13%12%11%10%0F%0E%0D%0C%0B%0A%09%08%07%06%05%04%03%02%01%00");
  join(
    for i in t do
      item(ascii, 255 - index(ascii, i))
    end, "")
end;

(select Customer order reverseAscii(SansAccent(upper('First Name')))).'First Name'

Ordenar por varios campos

Para ordenar una tabla por varios campos, encadene varias instrucciones order by. Por ejemplo, el código siguiente ordena una lista primero por apellido y después por nombre en el caso de apellidos idénticos:

(select Customer order upper(SansAccent('First Name')) order upper(SansAccent('Last Name'))).
---{'First Name'} {'Last Name'}---;

Nota: las instrucciones order by van del campo menos significativo al más significativo.

Ordenar arrays JSON

También es posible ordenar arrays JSON:

Ejemplo:

var myArray := [ {'prénom' : "Jan"}, {'prénom' : "Fred"}, {'prénom' : "Jacques"}];
myArray order by 'prénom';

También puede abreviar este código así:

([ {'prénom' : "Jan"}, {'prénom' : "Fred"}, {'prénom' : "Jacques"}] order by 'prénom');

Nota: el compilador no comprueba que exista la clave utilizada para ordenar. Si la clave no existe, el array quedará sin ordenar.