Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction LISTAGG() dans Oracle

Dans Oracle, le LISTAGG() La fonction nous permet de combiner les données de plusieurs lignes en une seule ligne.

Nous avons la possibilité de spécifier un séparateur (comme une virgule). On peut aussi ordonner les résultats produits par le LISTAGG() fonction, et plus encore.

Syntaxe

La syntaxe ressemble à ceci :

LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
  [ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]

listagg_overflow_clause est :

{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }

Exemple

Supposons que nous lancions la requête suivante :

SELECT region_name
FROM regions;

Résultat :

              REGION_NAME 
_________________________ 
Europe                    
Americas                  
Asia                      
Middle East and Africa    

Nous pouvons utiliser LISTAGG() pour convertir ces résultats dans une liste séparée par des virgules :

SELECT LISTAGG(region_name, ', ')
FROM regions;

Résultat :

                         LISTAGG(REGION_NAME,',') 
_________________________________________________ 
Europe, Americas, Asia, Middle East and Africa    

Changer le séparateur

Nous pouvons remplacer le deuxième argument par un séparateur différent :

SELECT LISTAGG(region_name, '; ') 
FROM regions;

Résultat :

Europe; Americas; Asia; Middle East and Africa 

Omettre le séparateur

Nous pouvons omettre le deuxième argument pour que chaque valeur soit concaténée sans séparateur :

SELECT LISTAGG(region_name) 
FROM regions;

Résultat :

EuropeAmericasAsiaMiddle East and Africa

Commander les résultats

Nous pouvons utiliser le WITHIN GROUP (ORDER BY...) clause pour ordonner la sortie du LISTAGG() fonction :

SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC) 
FROM regions;

Résultat :

Americas,Asia,Europe,Middle East and Africa

Utilisation dans les requêtes groupées

Nous pouvons utiliser le LISTAGG() fonction dans une requête groupée pour fournir des résultats comme celui-ci :

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;

Résultat :

   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           

Renvoyer uniquement des valeurs distinctes

Nous pouvons utiliser le DISTINCT clause pour ne renvoyer que des valeurs uniques :

SELECT LISTAGG(DISTINCT region_id, ', ') 
FROM regions;

Résultat :

1, 2, 3, 4

Consultez la documentation d'Oracle pour plus de détails sur ce que vous pouvez faire avec cette fonction.