ARRAY_FIRST_INDEX
array_first_index
Описание
Возвращает индекс (начиная с 1) первого элемента массива, удовлетворяющего условию лямбда-выражения. Функция применяет лямбда-выражение к элементам массива, находит первый элемент, удовлетворяющий условию, и возвращает его индекс.
Синтаксис
array_first_index(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
Возвращаемое значение
Тип возвращаемого значения: BIGINT
Значение результата:
- Возвращает индекс первого элемента массива, удовлетворяющего условию лямбда-выражения. Отсчёт начинается с 1, а не с 0. Если найденный элемент, удовлетворяющий условию, является первым элементом массива, функция возвращает 1, а не 0
- 0: если входной массив равен NULL и лямбда-выражение отсутствует, массив пуст или ни один элемент не удовлетворяет условию
Примечания по использованию:
- Число параметров лямбда-выражения должно совпадать с числом параметров-массивов
- Все входные массивы должны иметь одинаковую длину
- Поддерживается поиск по нескольким массивам и массивам элементов сложных типов
- Для пустых массивов возвращается 0. Если входной параметр — массив со значением NULL и лямбда-выражение отсутствует, возвращается 0. Если входной параметр — массив со значением NULL и задано лямбда-выражение, возникает ошибка
- В лямбда-выражении можно использовать любые скалярные выражения, но нельзя использовать агрегатные функции
- Лямбда-выражения могут вызывать другие функции высшего порядка, но типы возвращаемых значений должны быть совместимы
- Обработка значений null в элементах массива: элементы null передаются в лямбда-выражение для обработки, и в нём можно проверять наличие значений null
Примеры запросов:
Поиск индекса первого элемента, который больше или равен 3, в массиве чисел с плавающей точкой:
SELECT array_first_index(x -> x >= 3, [1.1, 2.2, 3.3, 4.4, 5.5]);
+-----------------------------------------------------------+
| array_first_index(x -> x >= 3, [1.1, 2.2, 3.3, 4.4, 5.5]) |
+-----------------------------------------------------------+
| 3 |
+-----------------------------------------------------------+
Поиск индекса первого элемента с длиной больше 2 в массиве строк:
SELECT array_first_index(x -> length(x) > 2, ['a', 'bb', 'ccc', 'dddd', 'eeeee']);
+----------------------------------------------------------------------------+
| array_first_index(x -> length(x) > 2, ['a', 'bb', 'ccc', 'dddd', 'eeeee']) |
+----------------------------------------------------------------------------+
| 3 |
+----------------------------------------------------------------------------+
Для пустого массива возвращается 0:
SELECT array_first_index(x -> x > 0, []);
+-----------------------------------+
| array_first_index(x -> x > 0, []) |
+-----------------------------------+
| 0 |
+-----------------------------------+
Сочетание массива со значением NULL и лямбда-выражения. Если вместе с NULL передано лямбда-выражение, возникает ошибка. Если лямбда-выражение отсутствует, возвращается 0:
SELECT array_first_index(NULL);
+-------------------------+
| array_first_index(NULL) |
+-------------------------+
| 0 |
+-------------------------+
SELECT array_first_index(x -> x > 2, NULL);
ERROR 1105 (HY000): errCode = 2, detailMessage = lambda argument must be array but is NULL
Массив со значениями null; лямбда-выражение может проверять наличие null:
SELECT array_first_index(x -> x is not null, [null, 1, null, 3, null, 5]);
+--------------------------------------------------------------------+
| array_first_index(x -> x is not null, [null, 1, null, 3, null, 5]) |
+--------------------------------------------------------------------+
| 2 |
+--------------------------------------------------------------------+
Поиск по нескольким массивам: поиск индекса первого элемента, для которого значение в первом массиве больше соответствующего значения во втором массиве:
SELECT array_first_index((x, y) -> x > y, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5]);
+--------------------------------------------------------------------------------+
| array_first_index((x, y) -> x > y, [1, 2, 3, 4, 5], [1.1, 2.2, 3.3, 4.4, 5.5]) |
+--------------------------------------------------------------------------------+
| 0 |
+--------------------------------------------------------------------------------+
Примеры со сложными типами:
Поиск во вложенном массиве: поиск индекса первого подмассива с длиной больше 2:
SELECT array_first_index(x -> size(x) > 2, [[1,2],[3,4,5],[6],[7,8,9,10]]);
+---------------------------------------------------------------------+
| array_first_index(x -> size(x) > 2, [[1,2],[3,4,5],[6],[7,8,9,10]]) |
+---------------------------------------------------------------------+
| 2 |
+---------------------------------------------------------------------+
Поиск по элементам типа Map: поиск индекса первого элемента, в котором значение по ключу 'a' больше 10:
SELECT array_first_index(x -> x['a'] > 10, [{'a':5}, {'a':15}, {'a':20}]);
+--------------------------------------------------------------------+
| array_first_index(x -> x['a'] > 10, [{'a':5}, {'a':15}, {'a':20}]) |
+--------------------------------------------------------------------+
| 2 |
+--------------------------------------------------------------------+
Ошибка при несовпадении числа параметров лямбда-выражения с числом параметров-массивов:
SELECT array_first_index(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_first_index((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_first_index(x -> x > 0, 'not_an_array');
ERROR 1105 (HY000): errCode = 2, detailMessage = lambda argument must be array but is 'not_an_array'
Ключевые слова
ARRAY, FIRST, INDEX, ARRAY_FIRST_INDEX