Fungsi Oracle LISTAGG adalah fungsi analitis yang memungkinkan kita untuk menggabungkan string untuk measure_column untuk setiap GROUP berdasarkan order_by_clause. Ini hadir di Oracle dari 11gR2
Sintaks untuk fungsi LISTAGG di Oracle adalah
LISTAGG (measure_column [, 'delimiter'])
WITHIN GROUP (order_by_clause) [OVER (query_partition_clause)]
Penjelasan istilah
measure_column | Kolom atau ekspresi yang nilainya ingin Anda gabungkan bersama dalam kumpulan hasil. Nilai nol dalam kolom_ukuran diabaikan. |
Pembatas | Opsional. Ini adalah pembatas yang digunakan saat memisahkan measure_column nilai saat mengeluarkan hasil. |
order_by_clause | Ini menentukan urutan pengembalian nilai gabungan |
Mari kita lihat beberapa kasus dan contoh pada fungsi LISTAGG
1) Sebagai fungsi agregat satu set, LISTAGG beroperasi pada semua baris dan mengembalikan satu baris keluaran.
SELECT LISTAGG(first_name, '; ')
WITHIN GROUP (ORDER BY hire_date, last_name) "Employee_list",
MIN(hire_date) "Earliest"
FROM emp
WHERE dept_no = 30;Employee_list Earliest
------------------------------------------------------------ ---------
TOM; BOB; BILL 17-JUN-18
2) Sebagai kumpulan kumpulan grup, fungsi beroperasi dan mengembalikan baris keluaran untuk setiap grup yang ditentukan oleh klausa GROUP BY.
COLUMN employees FORMAT A50
SELECT deptno, LISTAGG(ename, ';') WITHIN GROUP (ORDER BY ename) AS employees
FROM emp
GROUP BY deptno;
DEPTNO EMPLOYEES
---------- --------------------------------------------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; BILLMore Example
select table_name,
listagg(index_name, ',') within group (order by index_name) all_inds
from user_indexes
group by table_name;
3)Sebagai fungsi analitik, LISTAGG mempartisi hasil kueri yang disetel ke dalam grup berdasarkan satu atau lebih ekspresi di query_partition_clause.
SQL> SELECT deptno
, ename
, hiredate
, LISTAGG(ename, ',')
WITHIN GROUP (ORDER BY hiredate)
OVER (PARTITION BY deptno) AS employees
FROM emp order by deptno;DEPTNO ENAME HIREDATE EMPLOYEES
---------- ---------- ----------- -------------------------------------
10 JOSHUA 09/06/2018 JOSHUA,KING,MILLER
10 KING 17/11/2018 JOSHUA,KING,MILLER
10 MILLER 23/01/2018 JOSHUA,KING,MILLER
20 AJAY 17/12/2018 AJAY,FANES,SCOTT,SMITH
20 FANES 02/04/2018 AJAY,FANES,SCOTT,SMITH
20 SCOTT 19/04/2018 AJAY,FANES,SCOTT,SMITH
20 SMITH 23/05/2018 AJAY,FANES,SCOTT,SMITH
30 TOM 20/02/2018 TOM; BOB; BILL
30 BOB 22/02/2018 TOM; BOB; BILL
30 BILL 01/05/2018 TOM; BOB; BILL
Penambahan fungsi LISTAGG dari database Oracle 12cR2
Jumlah maksimum karakter yang dikembalikan adalah 4000 byte dan jika melebihi , itu memberikan kesalahan
ORA-01489:hasil penggabungan string terlalu panjang
Dengan Oracle 12cR2 , Oracle telah menyediakan klausa pada overflow truncate untuk menangani kesalahan overflow dengan anggun
listagg (
measure, ','
[ on overflow (truncate|error) ]
[ text ] [ (with|without) count ]
) within group (order by cols)
Sekarang Anda dapat secara eksplisit mengatakan apakah Anda menginginkan semantik kesalahan atau pemotongan. Kode pra 12cR2 berfungsi dengan baik karena itu adalah perilaku default
Sekarang anggaplah, Anda tidak ingin mengembalikan kesalahan saat melewati 4k byte, lalu pada overflow truncate adalah solusinya.
select table_name,
listagg(index_name, ',' on overflow truncate) within group (order by index_name) inds
from user_indexes
group by table_name;
Jika terjadi pemotongan, Oracle akan memotong kembali ke nilai penuh berikutnya di mana Anda dapat mengontrol cara memberi tahu pengguna bahwa daftar telah dipotong. Secara default kami menambahkan tiga titik '...' ke string sebagai indikator bahwa pemotongan telah terjadi. Anda dapat mengubah '....' jika mau, Anda dapat menggantinya
Jika Anda ingin mengganti “…” dengan “lebih”, “ekstra” atau hyperlink “klik untuk lebih banyak”, cukup berikan string baru Anda!
select table_name,
listagg(index_name, ',' on overflow truncate
'|||'
) within group (order by index_name) inds
from user_indexes
group by table_name;
Secara default, truncate menunjukkan jumlah nilai yang hilang Jika tidak ingin menampilkan hitungan, gunakan tanpa hitungan
select table_name,
listagg(index_name, ',' on overflow truncate '....' without count) within group (order by index_name) inds
from user_indexes
group by table_name;
Solusi pra 11GR2 (10g, 9i , 11gR1)
Jika Anda tidak menjalankan 11g Rilis 2 atau lebih tinggi, tetapi menjalankan versi database di mana fungsi WM_CONCAT hadir, maka ini adalah solusi tanpa usaha karena melakukan agregasi untuk Anda. Ini sebenarnya adalah contoh fungsi agregat yang ditentukan pengguna yang dijelaskan di bawah ini, tetapi Oracle telah melakukan semua pekerjaan untuk Anda.
COLUMN employees FORMAT A50
SELECT deptno, wm_concat(ename) AS employees
FROM emp
GROUP BY deptno;
EPTNO EMPLOYEES
---------- --------------------------------------------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BOB; BILL
Hal ini juga dapat dicapai melalui fungsi yang ditentukan pengguna. Saya akan merekomendasikan memeriksa tautan asktom di bawah ini. Ini wajib dibaca
Daftar opsi alternatif
Saya harap Anda menyukai konten postingan ini di Fungsi Oracle LISTAGG
Artikel TerkaitKolom Peningkatan Otomatis – Urutan sebagai Nilai Default di Oracle dan mysql
Oracle Bergabung
Sql Set Operator
Cara menggunakan URL terjemahan google di Oracle plsql
Fungsi baris tunggal di sql
fungsi tanggal di Oracle