Hàm LISTAGG của Oracle là một chức năng phân tích cho phép chúng tôi nối các chuỗi cho cột_công_đoán cho mỗi NHÓM dựa trên_đơn_trị_của_bảng. Điều này hiện diện trong Oracle từ 11gR2
Cú pháp cho hàm LISTAGG trong Oracle là
LISTAGG (measure_column [, 'delimiter'])
WITHIN GROUP (order_by_clause) [OVER (query_partition_clause)]
Giải thích các điều khoản
Measure_column | Cột hoặc biểu thức có các giá trị bạn muốn nối với nhau trong tập kết quả. Các giá trị rỗng trong Measure_column bị bỏ qua. |
Dấu phân cách | Tùy chọn. Đây là dấu phân cách để sử dụng khi tách đo_cột giá trị khi xuất kết quả. |
order_by_clause | Nó xác định thứ tự mà các giá trị được nối được trả về |
Hãy xem một số trường hợp và ví dụ về hàm LISTAGG
1) Là một hàm tổng hợp một tập hợp duy nhất, LISTAGG hoạt động trên tất cả các hàng và trả về một hàng đầu ra duy nhất.
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) Là một tập hợp do nhóm thiết lập, hàm hoạt động trên và trả về một hàng đầu ra cho mỗi nhóm được xác định bởi mệnh đề 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) Là một hàm phân tích, LISTAGG phân vùng tập hợp kết quả truy vấn thành các nhóm dựa trên một hoặc nhiều biểu thức trong 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
Bổ sung trong hàm LISTAGG từ cơ sở dữ liệu Oracle 12cR2
Không có ký tự nào tối đa trả về là 4000 byte và nếu vượt quá, nó sẽ gây ra lỗi
ORA-01489:kết quả của việc nối chuỗi quá dài
Với Oracle 12cR2, Oracle đã cung cấp một điều khoản về tràn truncate để xử lý lỗi tràn một cách duyên dáng
listagg (
measure, ','
[ on overflow (truncate|error) ]
[ text ] [ (with|without) count ]
) within group (order by cols)
Bây giờ bạn có thể nói rõ ràng rằng bạn muốn lỗi hoặc cắt bớt ngữ nghĩa. Các mã 12cR2 trước hoạt động tốt vì đó là hành vi mặc định
Bây giờ, giả sử, bạn không muốn trả về lỗi khi nó vượt quá 4k byte, sau đó trên phần bổ sung truncate là giải pháp.
select table_name,
listagg(index_name, ',' on overflow truncate) within group (order by index_name) inds
from user_indexes
group by table_name;
Trong trường hợp bị cắt ngắn xảy ra, Oracle sẽ cắt ngắn trở lại giá trị đầy đủ tiếp theo tại thời điểm đó bạn có thể kiểm soát cách bạn thông báo cho người dùng biết rằng danh sách đã bị cắt bớt. Theo mặc định, chúng tôi thêm ba dấu chấm ‘…’ vào chuỗi làm chỉ báo rằng việc cắt ngắn đã xảy ra. Bạn có thể thay đổi ‘….’ Nếu bạn muốn, bạn có thể ghi đè điều đó
Nếu bạn muốn thay thế “…” bằng “thêm”, “thêm” hoặc siêu liên kết “nhấp để biết thêm”, chỉ cần cung cấp chuỗi mới của bạn!
select table_name,
listagg(index_name, ',' on overflow truncate
'|||'
) within group (order by index_name) inds
from user_indexes
group by table_name;
Theo mặc định, cắt ngắn hiển thị số lượng các giá trị bị thiếu Nếu không muốn hiển thị số lượng, hãy sử dụng mà không cần số lượng
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;
Giải pháp trước 11GR2 (10g, 9i, 11gR1)
Nếu bạn không chạy 11g Release 2 trở lên, nhưng đang chạy phiên bản cơ sở dữ liệu có chức năng WM_CONCAT, thì đó là một giải pháp không cần nỗ lực vì nó thực hiện tổng hợp cho bạn. Nó thực sự là một ví dụ về hàm tổng hợp do người dùng xác định được mô tả bên dưới, nhưng Oracle đã thực hiện tất cả công việc cho bạn.
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
Điều này cũng có thể đạt được thông qua chức năng do người dùng xác định. Tôi khuyên bạn nên kiểm tra liên kết hỏitom bên dưới. Cái này phải đọc
Tùy chọn thay thế Listagg
Tôi hy vọng bạn thích nội dung của bài đăng này về Hàm LISTAGG của Oracle
Các bài viết có liên quanCột tự động tăng dần - Trình tự làm giá trị mặc định trong Oracle và mysql
Oracle tham gia
Toán tử bộ Sql
Cách sử dụng google dịch URL trong Oracle plsql
Các hàm một hàng trong sql
hàm date trong oracle