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

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
  • Логический тип: BOOLEAN
  • Типы IP-адресов: IPV4, IPV6
  • Сложные типы данных: 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