Order by (albo order)
Instrukcja order sortuje tablicę obiektów nid, rid lub JSON i zwraca tę samą tablicę posortowaną. Po słowie order można opcjonalnie dodać słowo by.
Przykład:
(select Customer order 'First name').'first name'
Sortowanie tekstów
Teksty są sortowane według kodu ASCII. Wielkie i małe litery mają różne wartości, podobnie jak znaki diakrytyczne.
Przy sortowaniu alfabetycznym lepiej użyć funkcji upper(), aby przed sortowaniem zamienić tekst na wielkie litery:
(select Customer order upper('First name')).text('first name')
Uwaga: funkcja upper() nie usuwa znaków diakrytycznych, zamienia jedynie znaki na wielkie litery. Dlatego takie podejście działa przy sortowaniu alfabetycznym tylko częściowo.
Aby w pełni poradzić sobie ze znakami diakrytycznymi, potrzebna jest własna funkcja, która je usuwa:
Funkcja usuwająca znaki diakrytyczne:
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')
Sortowanie rosnące i malejące
Domyślnym porządkiem sortowania jest rosnący (od najmniejszej do największej wartości).
Aby posortować malejąco, sposób zależy od typu wartości:
Dla wartości liczbowych:
Można użyć znaku minus (-):
(select Invoice order -'Invoice Date').text('Invoice Date')
Dla tekstów:
Nie ma wbudowanej funkcji odwracającej tekst. Trzeba ją napisać. Poniżej przykład obsługujący wszystkie 256 znaków ASCII: funkcja przechodzi po kolejnych znakach i odwraca ich wartość:
Funkcja odwracająca tekst:
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'
Sortowanie po wielu polach
Aby posortować tabelę po kilku polach, należy połączyć kolejne instrukcje order by. Na przykład poniższy kod sortuje listę najpierw po nazwisku, a przy identycznych nazwiskach po imieniu:
(select Customer order upper(SansAccent('First Name')) order upper(SansAccent('Last Name'))).
---{'First Name'} {'Last Name'}---;
Uwaga: instrukcje order by układa się od pola najmniej znaczącego do najbardziej znaczącego.
Sortowanie tablic JSON
Można również sortować tablice JSON:
Przykład:
var myArray := [ {'prénom' : "Jan"}, {'prénom' : "Fred"}, {'prénom' : "Jacques"}];
myArray order by 'prénom';
Kod ten można także skrócić w następujący sposób:
([ {'prénom' : "Jan"}, {'prénom' : "Fred"}, {'prénom' : "Jacques"}] order by 'prénom');
Uwaga: kompilator nie sprawdza, czy klucz użyty do sortowania istnieje. Jeśli klucz nie istnieje, tablica pozostanie nieposortowana.
