Hologres V3.2 以降のバージョンでは、LAMBDA 式と高階配列関数がサポートされています。このトピックでは、その構文と使用方法について説明します。
LAMBDA 式
構文
LAMBDA [ (lambda_arg1, ..., lambda_argn) => expr ]パラメーター
LAMBDA[]: LAMBDA 式を宣言するために使用されるキーワードです。
(lambda_arg1, ..., lambda_argn) => expr: LAMBDA 関数を定義します。これは、次の部分で構成されています:(lambda_arg1, ..., lambda_argn): LAMBDA 関数の入力パラメーターです。データの型を指定せずに、任意の数の入力パラメーターを定義できます。複数の入力パラメーターは、括弧()で囲む必要があります。expr: 式の本文です。スカラー式のみがサポートされています。入力パラメーターを使用したり、テーブルの列名を参照したりできます。ネストされた LAMBDA 式もサポートされています。つまり、スカラー式内で LAMBDA 式を含む高階 ARRAY 関数を使用できます。ただし、集計関数、ウィンドウ関数、またはサブクエリはサポートされていません。PostgreSQL の式の詳細については、「式」をご参照ください。
=>: 入力パラメーターと式を区切るオペレーターです。
例
LAMBDA [ (x1, x2, x3) => x2 - x1 * x3 + array_min(arr_col) ]
高階配列関数
HG_ARRAY_MAP
説明: 1 つ以上の入力配列の対応する要素に LAMBDA 式を適用し、結果を含む新しい配列を返します。
HG_ARRAY_MAP(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);使用上の注意
この関数には、少なくとも 1 つの非定数引数が必要です。
パラメーター
LAMBDA[func(x1 [, ..., xN])]: LAMBDA 式を定義します。source_arr: 入力配列です。複数の配列を指定する場合、それらは同じ長さでなければなりません。
戻り値
配列を返します。返される配列のデータの型は、式の戻り値の型と同じです。返される配列の長さは、最初の入力配列の長さと同じです。いずれかの入力配列が NULL の場合、関数は NULL を返します。
例
サンプルデータ
DROP TABLE IF EXISTS tbl1; CREATE TABLE tbl1(id INT, arr_col1 INT[], arr_col2 INT[], col3 INT, col4 INT); INSERT INTO tbl1 VALUES(1, ARRAY[1,2,3], ARRAY[11,12,13],1,2); INSERT INTO tbl1 VALUES(2, ARRAY[21,22,23], ARRAY[31,32,33],10,20);例 1: col3 の値を arr_col1 の各要素に加算します。
SELECT id, HG_ARRAY_MAP (LAMBDA[x => x + col3], arr_col1) FROM tbl1 ORDER BY id;クエリは次の結果を返します:
id | hg_array_map ----+-------------- 1 | {2,3,4} 2 | {31,32,33} (2 rows)例 2:
arr_col1の対応する要素と定数配列を加算し、次にarr_col2配列の最小値を加算します。SELECT id, HG_ARRAY_MAP (LAMBDA[(x, y) => y + x + array_min (arr_col2)], arr_col1, ARRAY[5,6,7]) FROM tbl1 ORDER BY id;クエリは次の結果を返します:
id | hg_array_map ----+-------------- 1 | {17,19,21} 2 | {57,59,61} (2 rows)例 3: ネストされた LAMBDA 式を使用して
col3をarr_col2の各要素に加算し、次に結果の配列の最小値をarr_col1の各対応する要素に加算します。SELECT id, HG_ARRAY_MAP (LAMBDA[x => x + array_min (HG_ARRAY_MAP (LAMBDA[a => a + col3], arr_col2))], arr_col1) FROM tbl1 ORDER BY id;クエリは次の結果を返します:
id | hg_array_map ----+-------------- 1 | {13,14,15} 2 | {62,63,64} (2 rows)
HG_ARRAY_FILL
説明: 入力配列に LAMBDA 式を適用して BOOLEAN 配列を生成し、それを使用して最初の入力配列を塗りつぶします。プロセスは最も低いインデックスから開始されます。BOOLEAN 配列の要素が TRUE の場合、最初の入力配列の対応する要素が現在の塗りつぶし値になります。この塗りつぶし値は、次の TRUE 要素に遭遇するまで後続の要素に伝播されます。関数は最終的に塗りつぶされた配列を返します。
HG_ARRAY_FILL(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);使用上の注意
この関数には、少なくとも 1 つの非定数引数が必要です。
パラメーター
LAMBDA[func(x1 [, ..., xN])]: LAMBDA 式を定義します。source_arr: 入力配列です。複数の配列を指定する場合、それらは同じ長さでなければなりません。
戻り値
配列を返します。返される配列のデータの型と長さは、最初の入力配列のものと同じです。入力配列が NULL の場合、この関数は NULL を返します。
例
サンプルデータ
DROP TABLE IF EXISTS tbl2; CREATE TABLE tbl2(id INT, arr_col1 INT[], arr_col2 INT[], col3 INT, col4 INT); INSERT INTO tbl2 VALUES(1, ARRAY[1,2,3,4,5,6,7,8,9],ARRAY[1,0,0,1,0,0,0,1,0],1,2); INSERT INTO tbl2 VALUES(2, ARRAY[10,12,13,14,15,16,17,18,19],ARRAY[1,0,0,1,0,0,0,1,0],1,2);例 1: arr_col2 の要素が 0 より大きい場合、arr_col1 の対応する要素が塗りつぶし値として使用され、後続の要素はこの塗りつぶし値で置き換えられます。
SELECT id, HG_ARRAY_FILL (LAMBDA[(x, y) => y > 0], arr_col1, arr_col2) FROM tbl2 ORDER BY id;クエリは次の結果を返します:
id | hg_array_fill ----+------------------------------ 1 | {1,1,1,4,4,4,4,8,8} 2 | {10,10,10,14,14,14,14,18,18} (2 rows)例 2:
arr_col2の要素が 0 以下の場合、arr_col1の対応する要素が塗りつぶし値として使用されます。arr_col2の最初の要素は 0 より大きいため、結果の最初の要素はarr_col1の元の値になります。SELECT id, HG_ARRAY_FILL (LAMBDA[(x, y) => y <= 0], arr_col1, arr_col2) FROM tbl2 ORDER BY id;クエリは次の結果を返します:
id | hg_array_fill ----+------------------------------ 1 | {1,2,3,3,5,6,7,7,9} 2 | {10,12,13,13,15,16,17,17,19} (2 rows)
HG_ARRAY_FILTER
説明: 入力配列の対応する要素に LAMBDA 式を適用して BOOLEAN 配列を生成します。次に、この関数は最初の入力配列をフィルター処理し、BOOLEAN 配列の対応する値が TRUE である要素のみを保持します。この関数は、フィルター処理された要素の配列を返します。
HG_ARRAY_FILTER(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);使用上の注意
この関数には、少なくとも 1 つの非定数引数が必要です。
パラメーター
LAMBDA[func(x1 [, ..., xN])]: LAMBDA 式を定義します。source_arr: 入力配列です。複数の配列を指定する場合、それらは同じ長さでなければなりません。
戻り値
配列を返します。返される配列のデータの型は、最初の入力配列のものと同じです。入力配列が NULL の場合、この関数は NULL を返します。
例
サンプルデータ
DROP TABLE IF EXISTS tbl3; CREATE TABLE tbl3(id INT, arr_col1 INT[], arr_col2 INT[], col3 INT, col4 INT); INSERT INTO tbl3 VALUES(1, ARRAY[0,2,3,4,5,6,7,0,9], ARRAY[1,0,0,1,0,0,0,1,18],1,2); INSERT INTO tbl3 VALUES(2, NULL, ARRAY[31,32,33,34,35,36,37,38,39],10,20); INSERT INTO tbl3 VALUES(3, ARRAY[0,2,3,4,5,6,7,0,9], ARRAY[11,12,13,14,15,16,17,18,19],NULL,2);例 1: arr_col1 をフィルター処理し、arr_col2 の対応する要素が 0 より大きい要素のみを保持します。
SELECT id, HG_ARRAY_FILTER (LAMBDA[(x, y) => y > 0], arr_col1, arr_col2) FROM tbl3 ORDER BY id;クエリは次の結果を返します:
id | hg_array_filter ----+--------------------- 1 | {0,4,0,9} 2 | 3 | {0,2,3,4,5,6,7,0,9} (3 rows)例 2: 次の LAMBDA 条件によって生成された BOOLEAN 配列に基づいて
arr_col1をフィルター処理します:arr_col1の要素が 0 である、col3が NULL である、またはarr_col1とarr_col2の対応する要素の合計にcol3とcol4を加えたものが 20 より大きい。SELECT id, HG_ARRAY_FILTER ( LAMBDA[(x, y) => (x = 0) OR (col3 IS NULL) OR (x + y + col3 + col4 > 20)] , arr_col1, arr_col2) FROM tbl1 ORDER BY id;クエリは次の結果を返します:
id | hg_array_filter ----+--------------------- 1 | {} 2 | {21,22,23} (2 rows)
HG_ARRAY_SORT
説明: 入力配列に LAMBDA 式を適用してソートキー配列を生成します。次に、この関数は、このソートキー配列の昇順に基づいて最初の入力配列をソートし、結果を返します。
HG_ARRAY_SORT(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);使用上の注意
この関数には、少なくとも 1 つの非定数引数が必要です。
パラメーター
LAMBDA[func(x1 [, ..., xN])]: LAMBDA 式を定義します。source_arr: 入力配列です。複数の配列を指定する場合、それらは同じ長さでなければなりません。
戻り値
配列を返します。返される配列のデータの型と長さは、最初の入力配列のものと同じです。入力配列が NULL の場合、この関数は NULL を返します。
例
定数配列
ARRAY[4,5,6]を arr_col1 配列の要素の順序に基づいてソートします。DROP TABLE IF EXISTS tbl4; CREATE TABLE tbl4(id INT, arr_col1 INT[]); INSERT INTO tbl4 VALUES(1, ARRAY[3,1,2]); INSERT INTO tbl4 VALUES(2, ARRAY[2,3,1]); INSERT INTO tbl4 VALUES(3, ARRAY[1,2,3]); INSERT INTO tbl4 VALUES(4, NULL); SELECT id, HG_ARRAY_SORT (LAMBDA[(x,y) => y], ARRAY[4,5,6], arr_col1) FROM tbl4 ORDER BY id;クエリは次の結果を返します:
id | hg_array_sort ----+--------------- 1 | {5,6,4} 2 | {6,4,5} 3 | {4,5,6} 4 | (4 rows)arr_col1配列をarr_col2配列の要素の順序に基づいてソートします。DROP TABLE IF EXISTS tbl5; CREATE TABLE tbl5(id INT, arr_col1 TEXT[], arr_col2 INT[]); INSERT INTO tbl5 VALUES(1, ARRAY['1','2','3','4','5'], ARRAY[1,2,3,4,5]); INSERT INTO tbl5 VALUES(2, ARRAY['1','2','3','4','5'], NULL); INSERT INTO tbl5 VALUES(3, ARRAY['1','2','3','4','5'], ARRAY[21, 22, 20, 24, 25]); INSERT INTO tbl5 VALUES(4, ARRAY['1','2','3','4','5'], ARRAY[21, 24, 22, 25, 23]); INSERT INTO tbl5 VALUES(5, ARRAY['1','2','3','4','5'], ARRAY[21, 22, NULL, 24, 25]); SELECT id, HG_ARRAY_SORT (LAMBDA[(x, y) => y], arr_col1, arr_col2) FROM tbl5 ORDER BY id;クエリは次の結果を返します:
id | hg_array_sort ----+--------------- 1 | {1,2,3,4,5} 2 | 3 | {3,1,2,4,5} 4 | {1,3,5,2,4} 5 | {3,1,2,4,5} (5 rows)
HG_ARRAY_FIRST_INDEX
説明: 入力配列に LAMBDA 式を適用して BOOLEAN 配列を計算します。この関数は、TRUE である最初の要素のインデックスを返します。TRUE の要素がない場合、関数は 0 を返します。
HG_ARRAY_FIRST_INDEX(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);使用上の注意
この関数には、少なくとも 1 つの非定数引数が必要です。
パラメーター
LAMBDA[func(x1 [, ..., xN])]: LAMBDA 式を定義します。source_arr: 入力配列です。複数の配列を指定する場合、それらは同じ長さでなければなりません。
例
arr_col1配列内で 3 以上の最初の要素のインデックスを計算します。DROP TABLE IF EXISTS tbl6; CREATE TABLE tbl6(id INT, arr_col1 INT[]); INSERT INTO tbl6 VALUES(1, ARRAY[1,2,3,4,5]); INSERT INTO tbl6 VALUES(2, NULL); SELECT id, HG_ARRAY_FIRST_INDEX (LAMBDA[x => x >= 3], arr_col1) FROM tbl6 ORDER BY id;クエリは次の結果を返します:
id | hg_array_first_index ----+---------------------- 1 | 3 2 | (2 rows)