
LISTAGG en Oracle agrège plusieurs lignes en une seule chaîne de caractères, en séparant les valeurs par un délimiteur de votre choix. C’est la fonction idéale pour transformer une liste de lignes (ex. les produits d’une commande) en une chaîne lisible (« Pomme, Poire, Banane »). Voici la syntaxe complète avec exemples.
Syntaxe de base
SELECT LISTAGG(nom, ', ') WITHIN GROUP (ORDER BY nom) AS liste
FROM produits;
-- Résultat : "Banane, Poire, Pomme"nom: la colonne à concaténer.', ': le séparateur.WITHIN GROUP (ORDER BY …): obligatoire, définit l’ordre des éléments.
LISTAGG avec GROUP BY (le cas le plus utile)
-- la liste des produits, par commande
SELECT commande_id,
LISTAGG(nom_produit, ', ') WITHIN GROUP (ORDER BY nom_produit) AS produits
FROM lignes_commande
GROUP BY commande_id;Chaque commande devient une ligne avec ses produits regroupés. Voir notre tutoriel GROUP BY.
Supprimer les doublons : DISTINCT (12c R2+)
SELECT LISTAGG(DISTINCT ville, ', ') WITHIN GROUP (ORDER BY ville)
FROM clients;Gérer le dépassement de taille (ON OVERFLOW)
LISTAGG renvoie un VARCHAR2 limité à 4000 octets. Au-delà → erreur ORA-01489. Depuis 12c R2, gérez-le proprement :
SELECT LISTAGG(nom, ', ' ON OVERFLOW TRUNCATE '...' WITH COUNT)
WITHIN GROUP (ORDER BY nom)
FROM gros_catalogue;
-- tronque et ajoute "...(123)" pour indiquer le nombre d'éléments omisLISTAGG comme fonction analytique (OVER)
Sans GROUP BY, avec une partition, pour garder le détail des lignes :
SELECT employe, departement,
LISTAGG(employe, ', ') WITHIN GROUP (ORDER BY employe)
OVER (PARTITION BY departement) AS collegues
FROM employes;Cas d’usage fréquents
- Lister les rôles/permissions d’un utilisateur sur une ligne.
- Construire une liste d’e-mails séparés par
;. - Générer un rapport « 1 ligne par client » avec ses commandes.
Alternatives
- Avant 11g R2 (pas de LISTAGG) :
WM_CONCAT(non documenté) ouXMLAGG. - Très gros volumes dépassant 4000 octets sans troncature : utilisez
XMLAGGqui gère les CLOB.
FAQ
WITHIN GROUP est-il obligatoire ?
Oui : LISTAGG exige toujours WITHIN GROUP (ORDER BY …) pour définir l’ordre de concaténation.
Comment éviter l’erreur ORA-01489 ?
La chaîne dépasse 4000 octets. Utilisez ON OVERFLOW TRUNCATE (12c R2+) ou passez à XMLAGG pour des résultats plus longs.
Peut-on concaténer des nombres ?
Oui, mais convertissez-les en texte : LISTAGG(TO_CHAR(montant), ', '). Voir TO_CHAR.
