Trong Oracle, LISTAGG()
hàm cho phép chúng tôi kết hợp dữ liệu từ nhiều hàng thành một hàng.
Chúng tôi có tùy chọn chỉ định dấu phân tách (chẳng hạn như dấu phẩy). Chúng tôi cũng có thể sắp xếp các kết quả được tạo ra bởi LISTAGG()
chức năng và hơn thế nữa.
Cú pháp
Cú pháp như sau:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Ở đâu listagg_overflow_clause
là:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Ví dụ
Giả sử chúng ta chạy truy vấn sau:
SELECT region_name
FROM regions;
Kết quả:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Chúng ta có thể sử dụng LISTAGG()
để chuyển những kết quả đó thành danh sách được phân tách bằng dấu phẩy:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Kết quả:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Thay đổi Dấu phân tách
Chúng ta có thể thay đổi đối số thứ hai thành một dấu phân tách khác:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Kết quả:
Europe; Americas; Asia; Middle East and Africa
Bỏ qua Dấu phân cách
Chúng ta có thể bỏ qua đối số thứ hai để mỗi giá trị được nối với nhau mà không có dấu phân tách:
SELECT LISTAGG(region_name)
FROM regions;
Kết quả:
EuropeAmericasAsiaMiddle East and Africa
Sắp xếp kết quả
Chúng ta có thể sử dụng WITHIN GROUP (ORDER BY...)
mệnh đề đặt hàng đầu ra của LISTAGG()
chức năng:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Kết quả:
Americas,Asia,Europe,Middle East and Africa
Sử dụng trong các truy vấn được nhóm
Chúng ta có thể sử dụng LISTAGG()
hoạt động trong một truy vấn được nhóm để cung cấp các kết quả như sau:
SELECT
region_id,
LISTAGG(country_id, ', ') WITHIN GROUP (ORDER BY country_id ASC) AS "Countries"
FROM countries
GROUP BY region_id
ORDER BY region_id;
Kết quả:
REGION_ID Countries ____________ _________________________________ 1 BE, CH, DE, DK, FR, IT, NL, UK 2 AR, BR, CA, MX, US 3 AU, CN, HK, IN, JP, SG 4 EG, IL, KW, NG, ZM, ZW
Chỉ trả lại các giá trị riêng biệt
Chúng tôi có thể sử dụng DISTINCT
mệnh đề chỉ trả về các giá trị duy nhất:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Kết quả:
1, 2, 3, 4
Xem tài liệu của Oracle để biết thêm chi tiết về những gì bạn có thể làm với chức năng này.