LISTAGG |
Liste d'agrégations |
|---|---|
| Oracle Database SQL | Oracle 12c (12.2) ou supérieure |
Syntaxe
| LISTAGG( [ ALL ]measure_expr [, 'delimiter'] [ listagg_overflow_clause ] ) [ WITHIN GROUP ] ( order_by_clause ) [ OVER [ ( query_partition_clause ) ] ] |
Paramètres
| Nom | Description |
|---|---|
| ALL | Ce paramètre permet de conserver toutes les valeurs, y compris les doublons, lors de la concaténation. Sans ce mot clef, le comportement par défaut reste inchangé (aucune suppression). |
| measure_expr | Ce paramètre permet de spécifier l'expression ou la colonne dont les valeurs seront concaténées ligne par ligne dans le résultat. |
| 'delimiter' | Ce paramètre permet de définir le séparateur inséré entre les différentes valeurs concaténées. Si omis, aucun caractère n'est utilisé comme délimiteur. |
| listagg_overflow_clause | Ce paramètre permet de définir le comportement en cas de dépassement de la taille maximale autorisée pour une chaîne (4000 caractères en SQL). |
| WITHIN GROUP | Ce paramètre permet de spécifier que les lignes doivent être agrégées selon un ordre donné défini par la clause ORDER BY. |
| order_by_clause | Ce paramètre permet de définir l'ordre de concaténation des valeurs dans la chaîne finale, ce qui peut influencer l'ordre alphabétique, numérique,... |
| OVER | Ce paramètre permet d'utiliser LISTAGG comme fonction analytique, c'est-à-dire sans regrouper les lignes mais en conservant le détail tout en générant la concaténation. |
| query_partition_clause | Ce paramètre permet de diviser les lignes d'entrée en partitions, de manière à ce que LISTAGG s'applique indépendamment à chaque groupe de partitions. |
Description
Cette fonction permet de concaténer les valeurs d'une colonne sur plusieurs lignes en une seule chaîne de caractères, séparées par un délimiteur spécifié. Elle est souvent utilisée dans les agrégations pour produire des listes groupées (ex. noms, codes, catégories) à partir de requêtes SQL. Elle est compatible avec les clauses GROUP BY et peut également être utilisée avec une clause WITHIN GROUP (ORDER BY ...) pour contrôler l'ordre d'agrégation.
Remarques
- LISTAGG simplifie la transformation de lignes en colonnes : La fonction LISTAGG permet d'agréger plusieurs lignes contenant des valeurs similaires en une seule chaîne. Cela facilite la création de résultats compacts à partir de données relationnelles, évitant l'usage de sous-requêtes complexes ou de fonctions définies par l'utilisateur. Elle est notamment utile pour produire des listes lisibles dans des rapports.
- Elle supporte l'ordre de concaténation via WITHIN GROUP (ORDER BY ...) : LISTAGG permet un contrôle précis de l'ordre d'agrégation des valeurs. Grâce à la clause WITHIN GROUP, on peut trier les données selon des critères spécifiques avant leur concaténation, assurant ainsi une présentation logique ou hiérarchique des résultats.
- Le séparateur est personnalisable et facultatif : Le paramètre delimiter permet d'ajouter un caractère ou une chaîne personnalisée entre les valeurs concaténées. S'il est omis, les valeurs sont collées sans séparation, ce qui peut être utile dans des cas précis comme la génération de codes ou d'identifiants.
- La clause OVER rend LISTAGG disponible comme fonction analytique : À partir d'Oracle 19c, LISTAGG peut être utilisé sans regrouper les lignes, grâce à OVER (...). Cela permet d'obtenir, pour chaque ligne, l'agrégation des valeurs correspondant à sa partition, tout en gardant la granularité des données d'origine.
- Elle est sensible à la limite de 4000 caractères en SQL : En SQL standard, le résultat de LISTAGG ne peut dépasser 4000 caractères. Cette limitation peut provoquer des erreurs si l'agrégation dépasse cette taille, ce qui arrive fréquemment avec de grands ensembles de données.
- Le dépassement peut être géré avec ON OVERFLOW TRUNCATE : Oracle 12.2 a introduit la clause listagg_overflow_clause, permettant de tronquer proprement les résultats trop longs. Il est possible d'ajouter une indication visuelle comme ... pour signaler la troncature, évitant ainsi les erreurs de dépassement.
- ALL permet de conserver les doublons dans la liste concaténée : L'option ALL, introduite dans Oracle 21c, offre un comportement explicite pour inclure toutes les occurrences d'une valeur. Cela est utile quand chaque répétition a une signification métier (ex. : journalisation, historique d'événements).
- Elle se combine naturellement avec GROUP BY : Lorsqu'elle est utilisée sans OVER, LISTAGG nécessite généralement une clause GROUP BY. Cela permet de produire des listes de valeurs pour chaque groupe identifié, comme tous les noms d'étudiants par classe, ou toutes les commandes par client.
- LISTAGG peut produire des chaînes nulles si aucune donnée n'est présente : Si aucune ligne ne correspond à un groupe donné, LISTAGG renvoie NULL, ce qui peut fausser les résultats ou nécessiter une gestion supplémentaire avec des fonctions comme NVL ou COALESCE.
- Elle améliore la lisibilité dans des contextes de reporting : Dans les rapports métiers ou les tableaux de bord, LISTAGG permet de présenter plusieurs éléments liés sous forme de texte lisible, plutôt que sous forme tabulaire. Cela réduit la complexité visuelle et améliore l'interprétation des résultats.
- Elle est plus performante que des solutions alternatives basées sur XML : Avant l'apparition de LISTAGG, certaines concaténations étaient réalisées via XMLAGG, plus verbeuse et parfois plus lente. LISTAGG offre une alternative plus naturelle, performante et optimisée pour ce type d'opération.
- Elle est sensible aux valeurs NULL selon le contexte d'utilisation : Si measure_expr contient NULL, celui-ci est ignoré dans la concaténation. Ce comportement est important à prendre en compte, car il peut produire des résultats incomplets ou inattendus si les données ne sont pas nettoyées au préalable.
Dernière mise à jour : Dimanche, le 29 Juin 2025