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_col1dan array konstan, lalu menambahkan nilai minimum dari arrayarr_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
col3ke setiap elemenarr_col2, lalu menambahkan nilai minimum dari array yang dihasilkan ke setiap elemen yang sesuai dariarr_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_col2kurang dari atau sama dengan 0, elemen yang sesuai dariarr_col1digunakan sebagai nilai isi. Elemen pertama dariarr_col2lebih besar dari 0, dan elemen pertama dari hasil adalah nilai asli dariarr_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_col1berdasarkan array BOOLEAN yang dihasilkan oleh kondisi LAMBDA berikut: elemen dalamarr_col1adalah 0,col3adalah NULL, atau jumlah elemen yang sesuai dariarr_col1danarr_col2ditambahcol3dancol4lebih 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_col1berdasarkan urutan elemen dalam arrayarr_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_col1yang 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)