Последнее обновление
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в начале или в конце массива.
- Значение выражения
Пример
- Основной пример: элементы
NULLразмещаются в начале возвращаемого массива
SELECT ARRAY_SORT([2,1,3,null]);
+--------------------------+
| ARRAY_SORT([2,1,3,null]) |
+--------------------------+
| [null, 1, 2, 3] |
+--------------------------+
- Если входное значение равно
NULL, возвращаетсяNULL; если на вход передан пустой массив[], возвращается пустой массив.
SELECT ARRAY_SORT(NULL);
+------------------+
| ARRAY_SORT(NULL) |
+------------------+
| NULL |
+------------------+
SELECT ARRAY_SORT([]);
+----------------+
| ARRAY_SORT([]) |
+----------------+
| [] |
+----------------+
- Использование выражений
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]] |
+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
- Сортировка многомерного массива
SELECT ARRAY_SORT([[6, 2], [5, 6]]);
+------------------------------+
| ARRAY_SORT([[6, 2], [5, 6]]) |
+------------------------------+
| [[5, 6], [6, 2]] |
+------------------------------+