Order By (или Order)

Инструкция order сортирует массив nid, rid или объектов JSON и возвращает тот же массив в отсортированном виде. После order можно, при желании, поставить ключевое слово by.

Пример:

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

Сортировка текстов

Тексты сортируются по кодам ASCII. Прописные и строчные буквы имеют разные значения, как и буквы с диакритикой.
Для алфавитной сортировки лучше сначала привести текст к верхнему регистру функцией upper():

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

Примечание: функция upper() не убирает диакритические знаки, а только переводит символы в верхний регистр. Поэтому для алфавитной сортировки этого хватает лишь отчасти.
Чтобы полностью справиться с диакритикой, понадобится собственная функция, которая её убирает:

Функция удаления диакритических знаков:

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

Сортировка по возрастанию и по убыванию

По умолчанию сортировка идёт по возрастанию (от меньшего к большему).
Чтобы отсортировать по убыванию, приём зависит от типа значений:

Для числовых значений:

Можно поставить знак минус (-):

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

Для текстов:

Встроенной функции для «обращения» текста нет — её нужно написать самому. Ниже пример, который охватывает все 256 символов ASCII: он перебирает символы и заменяет каждый на противоположный по значению:

Функция обращения текста:

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'

Сортировка по нескольким полям

Чтобы отсортировать таблицу по нескольким полям, поставьте подряд несколько инструкций order by. Например, следующий код сортирует список сначала по фамилии, а при одинаковых фамилиях — по имени:

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

Примечание: инструкции order by идут от наименее значимого поля к наиболее значимому.

Сортировка массивов JSON

Массивы JSON тоже можно сортировать:

Пример:

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

Этот код можно записать и короче:

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

Примечание: компилятор не проверяет существование ключа, по которому идёт сортировка. Если ключа нет, массив останется неотсортированным.