Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara menggunakan Fungsi Oracle LISTAGG

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; BILL

More 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 Terkait
Kolom 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle PL/SQL mendapatkan IP v4 server?

  2. .masalah penyisipan JDBC berikutnya

  3. MySQL setara dengan Oracle's SEQUENCE.NEXTVAL

  4. GROUP BY / kebingungan fungsi agregat dalam SQL

  5. Tempat Pemusnahan Kursor