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

array_map

Описание

array_map() — это SQL-функция высшего порядка, которая может принимать лямбда-функции в качестве аргументов. Она применяет лямбда-функцию к входным массивам и возвращает новый массив.

array_map() может принимать несколько массивов и может быть вложена с лямбда-функциями для захвата переменной. Для получения дополнительной информации о лямбда-функциях см. Лямбда-выражения. Эта функция поддерживается начиная с версии 1.5.0.

Псевдоним — transform().

Синтаксис

array_map(lambda_function, arr1, arr2...)
array_map(arr1, arr2..., lambda_function)

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

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

Примеры

Пример 1: Увеличить каждый элемент массива на 100.

select array_map(x -> x+100,[1,2,3]);
+------------------------------------+
| array_map(x -> x + 100, [1, 2, 3]) |
+------------------------------------+
| [101,102,103] |
+------------------------------------+

Пример 2: Сложить массив1 [1,2,3] и массив2 [11,12,13] поэлементно.

select array_map((x,y) -> x + y, [1,2,3], [11,12,13]);
+-----------------------------------------------------+
| array_map((x, y) -> x + y, [1, 2, 3], [11, 12, 13]) |
+-----------------------------------------------------+
| [12,14,16] |
+-----------------------------------------------------+

Пример 3: Определить, больше ли элемент в x чем 1.5. Если да, для элемента возвращается log(x). Если нет, для соответствующего элемента возвращается (x+y).

select array_map((x,y) -> if(x>1.5,log(x),x+y), [1,2,3], [11,12,13]);
+--------------------------------------------------------------------------+
| array_map((x, y) -> if(x > 1.5, log(x), x + y), [1, 2, 3], [11, 12, 13]) |
+--------------------------------------------------------------------------+
| [12,0.6931471805599453,1.0986122886681098] |
+--------------------------------------------------------------------------+

Пример 4: Использование array_map() для захвата переменных. Возвращаемый элемент со значением 1 указывает, что условие выполнено.

-- В примере таблицы last_avg — это средний балл на последнем экзамене. score представляет баллы по трем предметам на текущем экзамене.

+------+----------+------------+
| id | last_avg | score |
+------+----------+------------+
| 1 | 55 | [50,60,70] |
| 2 | 73 | [70,65,75] |
| 3 | 89 | [88,92,90] |
+------+----------+------------+

-- Найти баллы, которые выше среднего балла последнего экзамена.
select array_map(x -> x > last_avg, score) from test_tbl;
+--------------------------------------+
| array_map(x -> x > last_avg, score) |
+--------------------------------------+
| [0,1,1] |
| [0,0,1] |
| [0,1,1] |
+--------------------------------------+

Пример 5: Использование вложенных лямбда-функций.

select array_map(x -> array_map(x->x+100, x),[[1,2.3],[4,3,2]]);
+-------------------------------------------------------------------+
| array_map(x -> array_map(x -> x + 100, x), [[1, 2.3], [4, 3, 2]]) |
+-------------------------------------------------------------------+
| [[101,102.3],[104,103,102]] |
+-------------------------------------------------------------------+

Пример 6: Возвращается ошибка, поскольку количество массивов и лямбда-параметров не совпадает. Лямбда-функция требует только один массив, но передано два массива.

select array_map(x -> x,[1],[2,4]);
ERROR 1064 (HY000): Lambda arguments should equal to lambda input arrays.