array_map
array_map() 是一个高阶 SQL 函数,可以将 lambda 函数作为参数。它将 lambda 函数应用于输入数组并返回一个新数组。
array_map() 可以接受多个数组,并且可以与 lambda 函数嵌套以捕获变量。有关 lambda 函数的更多信息,请参见 Lambda 表达式。此函数从 v2.5 开始支持。
别名是 transform()。
语法
array_map(lambda_function, arr1, arr2...)
array_map(arr1, arr2..., lambda_function)
使用说明
- Lambda 函数只能用作高阶函数的**第一个**或**最后一个**参数。任一位置都不会影响计算。
- 数组的数量必须与 lambda 函数中的输入参数的数量相同。否则,将返回错误。
- 所有数组必须具有相同数量的元素。否则,将返回错误。
示例
示例 1:将数组的每个元素增加 100。
select array_map(x -> x+100,[1,2,3]);
+------------------------------------+
| array_map(x -> x + 100, [1, 2, 3]) |
+------------------------------------+
| [101,102,103] |
+------------------------------------+
示例 2:将 array1 [1,2,3] 和 array2 [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 的元素表示满足条件。
-- In the example table, last_avg is the average score in the last exam. score represents the scores of three subjects in the current exam.
+------+----------+------------+
| id | last_avg | score |
+------+----------+------------+
| 1 | 55 | [50,60,70] |
| 2 | 73 | [70,65,75] |
| 3 | 89 | [88,92,90] |
+------+----------+------------+
-- Find the score that is higher than the average score of the last exam.
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:使用嵌套的 lambda 函数。
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:返回错误,因为数组和 lambda 参数的数量不一致。lambda 函数只需要一个数组,但传入了两个数组。
select array_map(x -> x,[1],[2,4]);
ERROR 1064 (HY000): Lambda arguments should equal to lambda input arrays.