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