メインコンテンツまでスキップ

array_map

array_map

概要

array_map() は、ラムダ関数を引数として取り、その関数を入力配列に適用し、新しい配列を返す高階SQL関数です。

array_map() は複数の配列を受け入れることができ、ラムダ関数とネストさせて変数をキャプチャすることもできます。ラムダ関数についての詳細は、Lambda式 を参照してください。この関数は v2.5 からサポートされています。

エイリアスは 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 は現在の試験の3科目の点数を表します。

+------+----------+------------+
| 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: 配列の数とラムダパラメータの数が一致しないため、エラーが返されます。ラムダ関数は1つの配列のみ必要ですが、2つの配列が渡されています。

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