Order By (o Order)

L'istruzione order ordina un array di nid, rid od oggetti JSON e restituisce lo stesso array ordinato. La parola chiave by può facoltativamente seguire order.

Esempio:

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

Ordinare i testi

L'ordinamento dei testi si basa sul codice ASCII. Maiuscole e minuscole hanno valori diversi, così come i caratteri accentati.
Per un ordinamento alfabetico conviene usare la funzione upper() per convertire il testo in maiuscolo prima di ordinare:

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

Nota: la funzione upper() non rimuove gli accenti, converte solo i caratteri in maiuscolo. Questo approccio funziona quindi solo in parte per l'ordinamento alfabetico.
Per gestire completamente gli accenti serve una funzione personalizzata che li rimuova:

Funzione di rimozione degli accenti:

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')

Ordinamento crescente e decrescente

L'ordinamento predefinito è crescente (dal più piccolo al più grande).
Per ordinare in senso decrescente, il metodo dipende dal tipo di valore:

Per i valori numerici:

Potete usare il segno meno (-):

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

Per i testi:

Non esiste una funzione incorporata per invertire un testo: bisogna crearla. Ecco un esempio che gestisce tutti i 256 caratteri ASCII, scorrendo ogni carattere e invertendone il valore:

Funzione di inversione del testo:

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'

Ordinamento su più campi

Per ordinare una tabella su più campi, concatenate più istruzioni order by. Per esempio, il codice seguente ordina un elenco prima per cognome, poi per nome a parità di cognome:

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

Nota: le istruzioni order by vanno dal campo meno significativo al più significativo.

Ordinare gli array JSON

È possibile ordinare anche gli array JSON:

Esempio:

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

Potete anche abbreviare il codice così:

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

Nota: il compilatore non verifica l'esistenza della chiave usata per l'ordinamento. Se la chiave non esiste, l'array resterà non ordinato.