すべてのプロダクト
Search
ドキュメントセンター

Hologres:LAMBDA 式と関連関数

最終更新日:Oct 15, 2025

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 式を使用して col3arr_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_col1arr_col2 の対応する要素の合計に col3col4 を加えたものが 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)