Перейти к основному содержимому
Версия: 2.0.x

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] |
+----------------------------------------------------------------------------------------+