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]
Où 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.