Перейти к содержимому
Последнее обновление

ARRAY_SORT

Описание​

Если лямбда-функция не указана, элементы массива сортируются по возрастанию. В противном случае сортировка выполняется в соответствии с лямбда-функцией.

Синтаксис​

ARRAY_SORT(<arr>)
ARRAY_SORT(<lambda>, <arr>)

Параметры​

ПараметрОписание
<arr>Массив ARRAY, элементы которого могут иметь числовой, логический, строковый тип, тип datetime, IP или другой поддерживаемый тип. Поддерживаются многомерные массивы, но все вложенные элементы должны иметь один из этих поддерживаемых типов.
<lambda>Необязательный компаратор, который принимает два элемента и возвращает -1, 0 или 1, если первый элемент соответственно меньше второго, равен ему или больше него.

Возвращаемое значение​

  • Если выражение lambda не указано
    • Возвращается ARRAY<T> того же типа, что и входной массив.
    • Элементы NULL размещаются в начале возвращаемого массива.
  • Если указано выражение lambda, сортировка выполняется в соответствии с этим выражением и возвращается ARRAY<T> того же типа, что и входной массив.

В серии Doris 4.1, начиная с 4.1.5, при использовании компаратора, который ссылается на аргумент внешней лямбда-функции или другой столбец, явно выдаётся ошибка. Компаратор может использовать только два собственных аргумента, а вложенная в него лямбда-функция не может захватывать эти аргументы компаратора. Это ограничение не затрагивает обычный захват аргументов во вложенных лямбда-функциях в ARRAY_MAP.

Примечания по использованию​

  • Если выражение lambda не указано
    • Если входное значение равно NULL, возвращается NULL; если на вход передан пустой массив [], возвращается пустой массив.
    • ARRAY_SORT сортирует по возрастанию, а ARRAY_REVERSE_SORT сортирует по убыванию.
  • Если указано выражение lambda
    • Значение выражения lambda должно быть -1, 0 или 1. При наличии значения NULL необходимо явно указать, следует ли размещать NULL в начале или в конце массива.

Пример​

  1. Основной пример: элементы NULL размещаются в начале возвращаемого массива
SELECT ARRAY_SORT([2,1,3,null]);
+--------------------------+
| ARRAY_SORT([2,1,3,null]) |
+--------------------------+
| [null, 1, 2, 3] |
+--------------------------+
  1. Если входное значение равно NULL, возвращается NULL; если на вход передан пустой массив [], возвращается пустой массив.
SELECT ARRAY_SORT(NULL);
+------------------+
| ARRAY_SORT(NULL) |
+------------------+
| NULL |
+------------------+
SELECT ARRAY_SORT([]);
+----------------+
| ARRAY_SORT([]) |
+----------------+
| [] |
+----------------+
  1. Использование выражений lambda
SELECT array_sort((x, y) -> IF(x < y, 1, IF(x = y, 0, -1)), [3, 2, 5, 1, 2]);
+-----------------------------------------------------------------------+
| array_sort((x, y) -> IF(x < y, 1, IF(x = y, 0, -1)), [3, 2, 5, 1, 2]) |
+-----------------------------------------------------------------------+
| [5, 3, 2, 2, 1] |
+-----------------------------------------------------------------------+
SELECT array_sort((x, y) -> IF(x < y, 1, IF(x = y, 0, -1)), ['bc', 'ab', 'dc']);
+--------------------------------------------------------------------------+
| array_sort((x, y) -> IF(x < y, 1, IF(x = y, 0, -1)), ['bc', 'ab', 'dc']) |
+--------------------------------------------------------------------------+
| ["dc", "bc", "ab"] |
+--------------------------------------------------------------------------+
SELECT array_sort((x, y) -> CASE WHEN x IS NULL THEN -1
WHEN y IS NULL THEN 1
WHEN x < y THEN 1
WHEN x = y THEN 0
ELSE -1 END,
[3, 2, null, 5, null, 1, 2]);
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| array_sort((x, y) -> CASE WHEN x IS NULL THEN -1
WHEN y IS NULL THEN 1
WHEN x < y THEN 1
WHEN x = y THEN 0
ELSE -1 END,
[3, 2, null, 5, null, 1, 2]) |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [null, null, 5, 3, 2, 2, 1] |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SELECT array_sort((x, y) -> CASE WHEN x IS NULL THEN 1
WHEN y IS NULL THEN -1
WHEN x < y THEN 1
WHEN x = y THEN 0
ELSE -1 END,
[3, 2, null, 5, null, 1, 2]);
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| array_sort((x, y) -> CASE WHEN x IS NULL THEN 1
WHEN y IS NULL THEN -1
WHEN x < y THEN 1
WHEN x = y THEN 0
ELSE -1 END,
[3, 2, null, 5, null, 1, 2]) |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [5, 3, 2, 2, 1, null, null] |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SELECT array_sort((x, y) -> IF(length(x) < length(y), -1,
IF(length(x) = length(y), 0, 1)),
['a', 'abcd', 'abc']);
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| array_sort((x, y) -> IF(length(x) < length(y), -1,
IF(length(x) = length(y), 0, 1)),
['a', 'abcd', 'abc']) |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| ["a", "abc", "abcd"] |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------+
SELECT array_sort((x, y) -> IF(cardinality(x) < cardinality(y), -1,
IF(cardinality(x) = cardinality(y), 0, 1)),
[[2, 3, 1], [4, 2, 1, 4], [1, 2]]);
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| array_sort((x, y) -> IF(cardinality(x) < cardinality(y), -1,
IF(cardinality(x) = cardinality(y), 0, 1)),
[[2, 3, 1], [4, 2, 1, 4], [1, 2]]) |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| [[1, 2], [2, 3, 1], [4, 2, 1, 4]] |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
  1. Сортировка многомерного массива
SELECT ARRAY_SORT([[6, 2], [5, 6]]);
+------------------------------+
| ARRAY_SORT([[6, 2], [5, 6]]) |
+------------------------------+
| [[5, 6], [6, 2]] |
+------------------------------+