Oracle
 sql >> Database >  >> RDS >> Oracle

LISTAGG() Funzione in Oracle

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.