LISTAGG Oracle : agréger plusieurs lignes en une chaîne

LISTAGG Oracle : concaténer plusieurs lignes en une seule chaîne avec séparateur. Syntaxe, GROUP BY, DISTINCT, ON OVERFLOW et exemples pratiques.

Illustration : fonction LISTAGG Oracle

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.

Publicité

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 omis

LISTAGG 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é) ou XMLAGG.
  • Très gros volumes dépassant 4000 octets sans troncature : utilisez XMLAGG qui 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.

Un nouveau tutoriel SQL par semaine

Nous ne spammons pas ! Consultez notre politique de confidentialité pour plus d’informations.

Publicité

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Cours SQL & Oracle — 100% gratuitVoir les cours →