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

ARRAY_EXISTS

array_exists​

SinceVersion 2.0.0

Описание​

Применяет лямбда-выражение к элементам массива и возвращает массив логических значений, указывающих, удовлетворяет ли каждый элемент условию. Функция применяет лямбда-выражение к каждому элементу массива и возвращает соответствующее логическое значение.

Синтаксис​

array_exists(lambda, array1, ...)

Параметры​

  • lambda:лямбда-выражение для проверки элементов массива; возвращает true/false или выражения, которые можно преобразовать в логические значения
  • array1, ...:один или несколько параметров типа ARRAY

Поддерживаемые типы T:

  • Числовые типы: TINYINT, SMALLINT, INT, BIGINT, LARGEINT, FLOAT, DOUBLE, DECIMAL
  • Строковые типы: CHAR, VARCHAR, STRING
  • Типы даты и времени: DATE, DATETIME, DATEV2, DATETIMEV2, TIMESTAMP_NS
  • Логический тип: BOOLEAN
  • Типы IP: IPV4, IPV6
  • UUID: UUID
  • Сложные типы данных: ARRAY, MAP, STRUCT

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

Тип возвращаемого значения: ARRAY

Значение результата:

  • Возвращает массив логических значений той же длины, что и входной массив; каждая позиция содержит результат применения лямбда-выражения к соответствующему элементу
  • NULL: если передан только параметр массива со значением NULL и отсутствует лямбда-выражение

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

  • Количество параметров лямбда-выражения должно совпадать с количеством переданных массивов
  • Все входные массивы должны иметь одинаковую длину
  • Поддерживается обработка нескольких массивов и массивов с элементами сложных типов
  • Для пустых массивов возвращаются пустые массивы. Если передан только параметр массива со значением NULL и отсутствует лямбда-выражение, возвращается NULL. Если лямбда-выражение присутствует, а массив имеет значение NULL, возникает ошибка
  • В лямбда-выражениях можно использовать любые скалярные выражения, но нельзя использовать агрегатные функции
  • Лямбда-выражения могут вызывать другие функции высшего порядка, но возвращаемые типы должны быть совместимы
  • Обработка значений null в элементах массива: элементы со значением null передаются в лямбда-выражение для обработки, и в нём можно проверять наличие значений null

Примеры запросов:

Проверка того, что каждый элемент массива чисел с плавающей точкой больше или равен 3:

SELECT array_exists(x -> x >= 3, [1.1, 2.2, 3.3, 4.4, 5.5]);
+--------------------------------------------------+
| array_exists(x -> x >= 3, [1.1, 2.2, 3.3, 4.4, 5.5]) |
+--------------------------------------------------+
| [0, 0, 1, 1, 1] |
+--------------------------------------------------+

Проверка того, что длина каждого элемента строкового массива больше 2:

SELECT array_exists(x -> length(x) > 2, ['a', 'bb', 'ccc', 'dddd', 'eeeee']);
+--------------------------------------------------+
| array_exists(x -> length(x) > 2, ['a', 'bb', 'ccc', 'dddd', 'eeeee']) |
+--------------------------------------------------+
| [0, 0, 1, 1, 1] |
+--------------------------------------------------+

Для пустого массива возвращается пустой массив:

SELECT array_exists(x -> x > 0, []);
+-------------------------------------+
| array_exists(x -> x > 0, []) |
+-------------------------------------+
| [] |
+-------------------------------------+

Сочетание массива со значением NULL и лямбда-выражения. Если лямбда-выражение присутствует, а массив имеет значение NULL, возникает ошибка. Если лямбда-выражение отсутствует, возвращается NULL:

SELECT array_exists(NULL);
+--------------------+
| array_exists(NULL) |
+--------------------+
| NULL |
+--------------------+

SELECT array_exists(x -> x > 2, NULL);
ERROR 1105 (HY000): errCode = 2, detailMessage = lambda argument must be array but is NULL

Массив со значениями null: в лямбда-выражении можно проверять наличие null: Любая операция сравнения с null (например, >, <, =, >=, <=) возвращает null (за исключением специальных проверок IS NULL и IS NOT NULL), поскольку невозможно определить, больше ли неизвестное значение (NULL), чем 2. Такое поведение соответствует поведению MYSQL, POSTGRESSQL и других систем.

SELECT array_exists(x -> x is not null, [1, null, 3, null, 5]);
+------------------------------------------+
| array_exists(x -> x is not null, [1, null, 3, null, 5]) |
+------------------------------------------+
| [1, 0, 1, 0, 1] |
+------------------------------------------+

SELECT array_exists(x -> x > 2, [1, null, 3, null, 5]);
+-------------------------------------------------+
| array_exists(x -> x > 2, [1, null, 3, null, 5]) |
+-------------------------------------------------+
| [0, null, 1, null, 1] |
+-------------------------------------------------+

Обработка нескольких массивов: проверка того, что элементы первого массива больше соответствующих элементов второго:

SELECT array_exists((x, y) -> x > y, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5]);
+--------------------------------------------------------+
| array_exists((x, y) -> x > y, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5]) |
+--------------------------------------------------------+
| [0, 0, 0, 0, 0] |
+--------------------------------------------------------+

Примеры со сложными типами:

Обработка вложенного массива: проверка того, что длина каждого подмассива больше 2:

SELECT array_exists(x -> size(x) > 2, [[1,2],[3,4,5],[6],[7,8,9,10]]);
+----------------------------------------------------------------+
| array_exists(x -> size(x) > 2, [[1,2],[3,4,5],[6],[7,8,9,10]]) |
+----------------------------------------------------------------+
| [0, 1, 0, 1] |
+----------------------------------------------------------------+

Обработка типа Map: проверка того, что значение по ключу 'a' больше 10:

SELECT array_exists(x -> x['a'] > 10, [{'a':5}, {'a':15}, {'a':20}]);
+---------------------------------------------------------------+
| array_exists(x -> x['a'] > 10, [{'a':5}, {'a':15}, {'a':20}]) |
+---------------------------------------------------------------+
| [0, 1, 1] |
+---------------------------------------------------------------+

Ошибка при несовпадении количества параметров лямбда-выражения и количества переданных массивов:

SELECT array_exists(x -> x > 0, [1,2,3], [4,5,6], [7,8,9]);
ERROR 1105 (HY000): errCode = 2, detailMessage = lambda x -> (x > 0) arguments' size is not equal parameters' size

Ошибка при несовпадении длин массивов:

SELECT array_exists((x, y) -> x > y, [1,2,3], [4,5]);
ERROR 1105 (HY000): errCode = 2, detailMessage = (10.16.10.6)[INVALID_ARGUMENT]in array map function, the input column size are not equal completely, nested column data rows 1st size is 3, 2th size is 2.

Ошибка при передаче значения, тип которого не является массивом:

SELECT array_exists(x -> x > 0, 'not_an_array');
ERROR 1105 (HY000): errCode = 2, detailMessage = lambda argument must be array but is 'not_an_array'

Ключевые слова​

ARRAY, EXISTS, ARRAY_EXISTS