全部产品
Search
文档中心

Hologres:Ekspresi LAMBDA dan Fungsi Terkait

更新时间:Oct 15, 2025

Hologres V3.2 dan versi lebih baru mendukung ekspresi LAMBDA serta fungsi array orde tinggi. Topik ini menjelaskan sintaksis dan penggunaannya.

Ekspresi LAMBDA

  • Sintaksis

    LAMBDA [ (lambda_arg1, ..., lambda_argn) => expr ]
  • Parameter

    • LAMBDA[]: Kata kunci untuk mendeklarasikan ekspresi LAMBDA.

    • (lambda_arg1, ..., lambda_argn) => expr: Mendefinisikan fungsi LAMBDA dengan komponen berikut:

      • (lambda_arg1, ..., lambda_argn): Parameter input fungsi LAMBDA. Anda dapat menentukan beberapa parameter tanpa perlu menyertakan tipe datanya. Parameter harus diletakkan dalam tanda kurung ().

      • expr: Tubuh ekspresi yang hanya mendukung ekspresi skalar. Anda dapat menggunakan parameter input atau merujuk nama kolom tabel. Ekspresi LAMBDA bersarang didukung, memungkinkan penggunaan fungsi ARRAY orde tinggi yang mengandung ekspresi LAMBDA di dalam ekspresi skalar. Namun, fungsi agregat, fungsi jendela, atau subkueri tidak didukung.

        Untuk informasi lebih lanjut tentang ekspresi dalam PostgreSQL, lihat Ekspresi.

      • =>: Operator yang memisahkan parameter input dari ekspresi.

  • Contoh

    LAMBDA [ (x1, x2, x3) => x2 - x1 * x3 + array_min(arr_col) ]

Fungsi array orde tinggi

HG_ARRAY_MAP

  • Deskripsi: Menerapkan ekspresi LAMBDA ke elemen-elemen yang sesuai dari satu atau lebih array input dan mengembalikan array baru berisi hasilnya.

    HG_ARRAY_MAP(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);
  • Catatan Penggunaan

    Fungsi ini memerlukan setidaknya satu argumen non-konstan.

  • Parameter

    • LAMBDA[func(x1 [, ..., xN])]: Mendefinisikan ekspresi LAMBDA.

    • source_arr: Array input. Jika Anda menentukan beberapa array, mereka harus memiliki panjang yang sama.

  • Nilai Kembali

    Mengembalikan array dengan tipe data yang sama dengan nilai kembali dari ekspresi. Panjang array yang dikembalikan sama dengan panjang array input pertama. Fungsi mengembalikan NULL jika salah satu array input adalah NULL.

  • Contoh

    Data Sampel

    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);
    • Contoh 1: Menambahkan nilai col3 ke setiap elemen arr_col1.

      SELECT
          id,
          HG_ARRAY_MAP (LAMBDA[x => x + col3], arr_col1)
      FROM
          tbl1
      ORDER BY
          id;

      Kueri mengembalikan hasil berikut:

      id | hg_array_map 
      ----+--------------
        1 | {2,3,4}
        2 | {31,32,33}
      (2 rows)
    • Contoh 2: Menambahkan elemen-elemen yang sesuai dari arr_col1 dan array konstan, lalu menambahkan nilai minimum dari array 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;

      Kueri mengembalikan hasil berikut:

      id | hg_array_map 
      ----+--------------
        1 | {17,19,21}
        2 | {57,59,61}
      (2 rows)
    • Contoh 3: Menggunakan ekspresi LAMBDA bersarang untuk menambahkan col3 ke setiap elemen arr_col2, lalu menambahkan nilai minimum dari array yang dihasilkan ke setiap elemen yang sesuai dari 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;

      Kueri mengembalikan hasil berikut:

      id | hg_array_map 
      ----+--------------
        1 | {13,14,15}
        2 | {62,63,64}
      (2 rows)

HG_ARRAY_FILL

  • Deskripsi: Menerapkan ekspresi LAMBDA ke array input untuk menghasilkan array BOOLEAN, yang digunakan untuk mengisi array input pertama. Proses dimulai dari indeks terendah: jika elemen dalam array BOOLEAN bernilai TRUE, elemen yang sesuai dari array input pertama menjadi nilai isi saat ini. Nilai ini disebarkan ke elemen-elemen berikutnya hingga elemen TRUE berikutnya ditemui. Fungsi mengembalikan array akhir yang telah diisi.

    HG_ARRAY_FILL(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);
  • Catatan Penggunaan

    Fungsi ini memerlukan setidaknya satu argumen non-konstan.

  • Parameter

    • LAMBDA[func(x1 [, ..., xN])]: Mendefinisikan ekspresi LAMBDA.

    • source_arr: Array input. Jika Anda menentukan beberapa array, mereka harus memiliki panjang yang sama.

  • Nilai Kembali

    Mengembalikan array dengan tipe data dan panjang yang sama dengan array input pertama. Jika array input adalah NULL, fungsi ini mengembalikan NULL.

  • Contoh

    Data Sampel

    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);
    • Contoh 1: Jika elemen dalam arr_col2 lebih besar dari 0, elemen yang sesuai dari arr_col1 digunakan sebagai nilai isi, dan elemen berikutnya diganti dengan nilai ini.

      SELECT
          id,
          HG_ARRAY_FILL (LAMBDA[(x, y) => y > 0], arr_col1, arr_col2)
      FROM
          tbl2
      ORDER BY
          id;

      Kueri mengembalikan hasil berikut:

      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)
    • Contoh 2: Jika elemen dalam arr_col2 kurang dari atau sama dengan 0, elemen yang sesuai dari arr_col1 digunakan sebagai nilai isi. Elemen pertama dari arr_col2 lebih besar dari 0, dan elemen pertama dari hasil adalah nilai asli dari arr_col1.

      SELECT
          id,
          HG_ARRAY_FILL (LAMBDA[(x, y) => y <= 0], arr_col1, arr_col2)
      FROM
          tbl2
      ORDER BY
          id;

      Kueri mengembalikan hasil berikut:

      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

  • Deskripsi: Menerapkan ekspresi LAMBDA ke elemen-elemen yang sesuai dari array input untuk menghasilkan array BOOLEAN. Fungsi kemudian menyaring array input pertama, hanya menyimpan elemen-elemen di mana nilai yang sesuai dalam array BOOLEAN bernilai TRUE. Fungsi mengembalikan array elemen yang telah disaring.

    HG_ARRAY_FILTER(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);
  • Catatan Penggunaan

    Fungsi ini memerlukan setidaknya satu argumen non-konstan.

  • Parameter

    • LAMBDA[func(x1 [, ..., xN])]: Mendefinisikan ekspresi LAMBDA.

    • source_arr: Array input. Jika Anda menentukan beberapa array, mereka harus memiliki panjang yang sama.

  • Nilai Kembali

    Mengembalikan array dengan tipe data yang sama dengan array input pertama. Jika array input adalah NULL, fungsi ini mengembalikan NULL.

  • Contoh

    Data Sampel

    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);
    • Contoh 1: Menyaring arr_col1, hanya menyimpan elemen-elemen di mana elemen yang sesuai dalam arr_col2 lebih besar dari 0.

      SELECT
          id,
          HG_ARRAY_FILTER (LAMBDA[(x, y) => y > 0], arr_col1, arr_col2)
      FROM
          tbl3
      ORDER BY
          id;

      Kueri mengembalikan hasil berikut:

      id |   hg_array_filter   
      ----+---------------------
        1 | {0,4,0,9}
        2 | 
        3 | {0,2,3,4,5,6,7,0,9}
      (3 rows)
    • Contoh 2: Menyaring arr_col1 berdasarkan array BOOLEAN yang dihasilkan oleh kondisi LAMBDA berikut: elemen dalam arr_col1 adalah 0, col3 adalah NULL, atau jumlah elemen yang sesuai dari arr_col1 dan arr_col2 ditambah col3 dan col4 lebih besar dari 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;

      Kueri mengembalikan hasil berikut:

      id |   hg_array_filter   
      ----+---------------------
        1 | {}
        2 | {21,22,23}
      (2 rows)

HG_ARRAY_SORT

  • Deskripsi: Menerapkan ekspresi LAMBDA ke array input untuk menghasilkan array kunci pengurutan. Fungsi kemudian mengurutkan array input pertama berdasarkan urutan menaik dari array kunci pengurutan ini dan mengembalikan hasilnya.

    HG_ARRAY_SORT(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);
  • Catatan Penggunaan

    Fungsi ini memerlukan setidaknya satu argumen non-konstan.

  • Parameter

    • LAMBDA[func(x1 [, ..., xN])]: Mendefinisikan ekspresi LAMBDA.

    • source_arr: Array input. Jika Anda menentukan beberapa array, mereka harus memiliki panjang yang sama.

  • Nilai Kembali

    Mengembalikan array dengan tipe data dan panjang yang sama dengan array input pertama. Jika array input adalah NULL, fungsi ini mengembalikan NULL.

  • Contoh

    • Mengurutkan array konstan ARRAY[4,5,6] berdasarkan urutan elemen dalam array 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;

      Kueri mengembalikan hasil berikut:

      id | hg_array_sort 
      ----+---------------
        1 | {5,6,4}
        2 | {6,4,5}
        3 | {4,5,6}
        4 | 
      (4 rows)
    • Mengurutkan array arr_col1 berdasarkan urutan elemen dalam array 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;

      Kueri mengembalikan hasil berikut:

      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

  • Deskripsi: Menerapkan ekspresi LAMBDA ke array input untuk menghitung array BOOLEAN. Fungsi mengembalikan indeks elemen pertama yang bernilai TRUE. Jika tidak ada elemen yang bernilai TRUE, fungsi mengembalikan 0.

    HG_ARRAY_FIRST_INDEX(LAMBDA[func(x1 [, ..., xN])], source_arr1 [, ..., source_arrN]);
  • Catatan Penggunaan

    Fungsi ini memerlukan setidaknya satu argumen non-konstan.

  • Parameter

    • LAMBDA[func(x1 [, ..., xN])]: Mendefinisikan ekspresi LAMBDA.

    • source_arr: Array input. Jika Anda menentukan beberapa array, mereka harus memiliki panjang yang sama.

  • Contoh

    Menghitung indeks elemen pertama dalam array arr_col1 yang lebih besar dari atau sama dengan 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;

    Kueri mengembalikan hasil berikut:

    id | hg_array_first_index 
    ----+----------------------
      1 |          3
      2 | 
    (2 rows)