Order By (oder Order)

Die Anweisung order sortiert ein Array aus nid, rid oder JSON-Objekten und gibt dasselbe Array sortiert zurück. Auf order kann wahlweise das Schlüsselwort by folgen.

Beispiel:

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

Text sortieren

Text wird nach ASCII-Code sortiert. Groß- und Kleinbuchstaben haben unterschiedliche Werte, ebenso Zeichen mit Akzent.
Für eine alphabetische Sortierung ist es besser, den Text vor dem Sortieren mit der Funktion upper() in Großbuchstaben umzuwandeln:

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

Hinweis: Die Funktion upper() entfernt keine Akzente, sie wandelt lediglich in Großbuchstaben um. Für eine alphabetische Sortierung reicht dieses Vorgehen daher nur teilweise aus.
Um Akzente vollständig zu behandeln, brauchen Sie eine eigene Funktion, die sie entfernt:

Funktion zum Entfernen der Akzente:

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

Auf- und absteigend sortieren

Die Standardreihenfolge ist aufsteigend (vom kleinsten zum größten Wert).
Für eine absteigende Sortierung hängt das Vorgehen vom Werttyp ab:

Bei Zahlenwerten:

Sie können das Minuszeichen (-) verwenden:

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

Bei Text:

Es gibt keine eingebaute Funktion, um Text umzukehren. Sie müssen sie selbst schreiben. Das folgende Beispiel behandelt alle 256 ASCII-Zeichen: Es durchläuft jedes Zeichen und kehrt dessen Wert um.

Funktion zum Umkehren von Text:

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'

Nach mehreren Feldern sortieren

Um eine Tabelle nach mehreren Feldern zu sortieren, reihen Sie mehrere order by-Anweisungen aneinander. Das folgende Beispiel sortiert eine Liste zuerst nach Nachnamen und bei gleichem Nachnamen nach Vornamen:

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

Hinweis: Die order by-Anweisungen stehen vom unwichtigsten zum wichtigsten Feld.

JSON-Arrays sortieren

Auch JSON-Arrays lassen sich sortieren:

Beispiel:

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

Diesen Code können Sie auch verkürzt schreiben:

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

Hinweis: Der Compiler prüft nicht, ob der zum Sortieren verwendete Schlüssel vorhanden ist. Fehlt der Schlüssel, so bleibt das Array unsortiert.