array_sort
Сортирует элементы массива в порядке возрастания.
Синтаксис
array_sort(array)
array_sort(array, (x,y)->expr(x,y))
Параметры
array: массив, элементы которого вы хотите отсортировать. Поддерживается только тип данных ARRAY.
lambda_comparator: необязательная lambda-функция компаратор в формате (x,y)->expr(x,y). Lambda-компаратор:
- Должен зависеть только от аргументов x и y
- Должен возвращать булев или числовой тип
- Результат не должен быть NULL
- Должен удовлетворять требованиям строгого слабого порядка
Возвращаемое значение
Возвращает массив.
Примечания по использованию
Базовая сортировка
- Эта функция сортирует элементы массива в порядке возрастания при использовании без lambda-компаратора.
- Значения
NULLпомещаются в начало возвращаемого массива. - Элементы возвращаемого массива имеют тот же тип данных, что и элементы входного массива.
Сортировка с Lambda-компаратором
-
При использовании lambda-компаратора порядок сортировки определяется результатом выражения:
- Для булева возврата:
trueозначает, что x должен быть перед y - Для числового возврата: отрицательное значение означает, что x идет перед y
- Для булева возврата:
-
Lambda-компаратор должен удовлетворять требованиям строгого слабого порядка:
- Иррефлексивность: Для всех
x,expr(x, x)должно возвращать false (булев) или неотрицательное значение (числовой) - Асимметрия: Если
expr(x, y)выполняется, тоexpr(y, x)не должно выполняться - Транзитивность: Если
expr(x, y)иexpr(y, z)выполняются, тоexpr(x, z)должно выполняться - Связность: Для всех
xиy, либоexpr(x, y), либоexpr(y, x), либоx = yдолжно быть истинным
- Иррефлексивность: Для всех
-
Выражение lambda-компаратора должно:
- Зависеть только от параметров
xиy - Возвращать булев или числовой тип
- Никогда не возвращать NULL
- Всегда выдавать одинаковые результаты для одинаковых входных значений
- Зависеть только от параметров
Порядок убывания
- Если вы хотите отсортировать элементы массива в порядке убывания, используйте функцию reverse.
Примеры
В качестве примера используется следующая таблица:
mysql> select * from test;
+------+--------------+
| c1 | c2 |
+------+--------------+
| 1 | [4,3,null,1] |
| 2 | NULL |
| 3 | [null] |
| 4 | [8,5,1,4] |
+------+--------------+
Сортировать значения столбца c2 в порядке возрастания.
mysql> select c1, array_sort(c2) from test;
+------+------------------+
| c1 | array_sort(`c2`) |
+------+------------------+
| 1 | [null,1,3,4] |
| 2 | NULL |
| 3 | [null] |
| 4 | [1,4,5,8] |
+------+------------------+
Примеры с Lambda-компаратором
Отсортировать массив целых чисел в порядке убывания, используя lambda-компаратор:
mysql> select array_sort([3,1,4,2], (x,y) -> x > y);
+-----------------------------------------+
| array_sort([3, 1, 4, 2], (x, y) -> x > y) |
+-----------------------------------------+
| [4, 3, 2, 1] |
+-----------------------------------------+
Отсортировать массив целых чисел, используя числовые возвращаемые значения:
mysql> select array_sort([3,1,4,2], (x,y) -> x - y);
+----------------------------------------+
| array_sort([3, 1, 4, 2], (x, y) -> x - y) |
+----------------------------------------+
| [1, 2, 3, 4] |
+----------------------------------------+
Отсортировать массив строк по длине:
mysql> select array_sort(['apple', 'banana', 'cherry', 'date'], (x,y) -> length(x) - length(y));
+----------------------------------------------------------------------------+
| array_sort(['apple', 'banana', 'cherry', 'date'], (x, y) -> length(x) - length(y)) |
+----------------------------------------------------------------------------+
| ['date', 'apple', 'banana', 'cherry'] |
+----------------------------------------------------------------------------+
Отсортировать массив строк в алфавитном порядке, используя булев возврат:
mysql> select array_sort(['banana', 'apple', 'cherry'], (x,y) -> x > y);
+--------------------------------------------------------+
| array_sort(['banana', 'apple', 'cherry'], (x, y) -> x > y) |
+--------------------------------------------------------+
| ['apple', 'banana', 'cherry'] |
+--------------------------------------------------------+
Отсортировать массив с пользовательской бизнес-логикой (сначала четные числа, затем нечетные):
mysql> select array_sort([5,2,8,1,9,4], (x,y) ->
case when x % 2 = 0 and y % 2 = 0 then x - y
when x % 2 = 0 and y % 2 = 1 then -1
when x % 2 = 1 and y % 2 = 0 then 1
else x - y end);
+--------------------------------------------------------------------------------------------------------------------+
| array_sort([5, 2, 8, 1, 9, 4], (x, y) -> case when x % 2 = 0 and y % 2 = 0 then x - y when x % 2 = 0 and y % 2 = 1 then -1 when x % 2 = 1 and y % 2 = 0 then 1 else x - y end) |
+--------------------------------------------------------------------------------------------------------------------+
| [2, 4, 8, 1, 5, 9] |
+--------------------------------------------------------------------------------------------------------------------+
Отсортировать массив десятичных дробей с пользовательским сравнением точности:
mysql> select array_sort([3.141, 2.718, 1.414, 2.236], (x,y) -> round(x, 2) - round(y, 2));
+----------------------------------------------------------------------------------------+
| array_sort([3.141, 2.718, 1.414, 2.236], (x, y) -> round(x, 2) - round(y, 2)) |
+----------------------------------------------------------------------------------------+
| [1.414, 2.236, 2.718, 3.141] |
+----------------------------------------------------------------------------------------+