In Oracle, il LISTAGG()
La funzione ci consente di combinare i dati di più righe in un'unica riga.
Abbiamo la possibilità di specificare un separatore (come una virgola). Possiamo anche ordinare i risultati prodotti da LISTAGG()
funzione e altro.
Sintassi
La sintassi è questa:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Dove listagg_overflow_clause
è:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Esempio
Supponiamo di eseguire la seguente query:
SELECT region_name
FROM regions;
Risultato:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Possiamo usare LISTAGG()
per convertire quei risultati in un elenco separato da virgole:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Risultato:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Cambia il separatore
Possiamo cambiare il secondo argomento con un separatore diverso:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Risultato:
Europe; Americas; Asia; Middle East and Africa
Ometti il separatore
Possiamo omettere il secondo argomento per concatenare ogni valore senza un separatore:
SELECT LISTAGG(region_name)
FROM regions;
Risultato:
EuropeAmericasAsiaMiddle East and Africa
Ordina i risultati
Possiamo usare il WITHIN GROUP (ORDER BY...)
clausola per ordinare l'output di LISTAGG()
funzione:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Risultato:
Americas,Asia,Europe,Middle East and Africa
Utilizzo nelle query raggruppate
Possiamo usare il LISTAGG()
funzione all'interno di una query raggruppata per fornire risultati come questo:
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;
Risultato:
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
Restituisci solo valori distinti
Possiamo usare il DISTINCT
clausola per restituire solo valori univoci:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Risultato:
1, 2, 3, 4
Consulta la documentazione di Oracle per maggiori dettagli su cosa puoi fare con questa funzione.