W Oracle LISTAGG()
funkcja umożliwia nam łączenie danych z wielu wierszy w jeden wiersz.
Mamy możliwość określenia separatora (np. przecinka). Możemy również uporządkować wyniki generowane przez LISTAGG()
funkcja i nie tylko.
Składnia
Składnia wygląda tak:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Gdzie listagg_overflow_clause
jest:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Przykład
Załóżmy, że uruchamiamy następujące zapytanie:
SELECT region_name
FROM regions;
Wynik:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Możemy użyć LISTAGG()
aby przekonwertować te wyniki na listę oddzieloną przecinkami:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Wynik:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Zmień separator
Drugi argument możemy zmienić na inny separator:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Wynik:
Europe; Americas; Asia; Middle East and Africa
Pomiń separator
Możemy pominąć drugi argument, aby każda wartość była łączona bez separatora:
SELECT LISTAGG(region_name)
FROM regions;
Wynik:
EuropeAmericasAsiaMiddle East and Africa
Uporządkuj wyniki
Możemy użyć WITHIN GROUP (ORDER BY...)
klauzula porządkująca wyjście LISTAGG()
funkcja:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Wynik:
Americas,Asia,Europe,Middle East and Africa
Użycie w zgrupowanych zapytaniach
Możemy użyć LISTAGG()
funkcjonować w zgrupowanym zapytaniu, aby dostarczyć takie wyniki:
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;
Wynik:
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
Zwróć tylko odrębne wartości
Możemy użyć DISTINCT
klauzula zwracająca tylko unikalne wartości:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Wynik:
1, 2, 3, 4
Zapoznaj się z dokumentacją Oracle, aby uzyskać więcej informacji na temat tego, co możesz zrobić za pomocą tej funkcji.