Maison > base de données > tutoriel mysql > Comment concaténer plusieurs lignes dans une liste séparée par des virgules dans SQL Server et Oracle ?

Comment concaténer plusieurs lignes dans une liste séparée par des virgules dans SQL Server et Oracle ?

DDD
Libérer: 2025-01-21 06:42:12
original
754 Les gens l'ont consulté

How to Concatenate Multiple Rows into a Comma-Separated List in SQL Server and Oracle?

Agrégation de plusieurs lignes SQL en une seule colonne délimitée par des virgules

Cet article montre comment consolider plusieurs lignes partageant un identifiant commun en une seule ligne avec une liste séparée par des virgules dans une colonne spécifique. L'exemple utilise un tableau avec les ID de ticket et les individus associés, dans le but de créer un résultat où chaque ID de ticket est lié à une liste de tous les individus impliqués.

Approche SQL Server (2005 et versions ultérieures)

La requête SQL Server suivante y parvient en utilisant STUFF(), ISNULL() et FOR XML PATH :

<code class="language-sql">SELECT t.TicketID,
       STUFF(ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma],
       ISNULL((SELECT ', ' + x.Person
                FROM @Tickets x
               WHERE x.TicketID = t.TicketID
            GROUP BY x.Person
             FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), '') [Preceeding Comma If Not Empty]
  FROM @Tickets t
GROUP BY t.TicketID</code>
Copier après la connexion

Cette requête utilise une sous-requête pour rassembler les individus associés à chaque TicketID. La méthode FOR XML PATH transforme le résultat en une chaîne concaténée et STUFF() supprime toute virgule de début. La fonction ISNULL() gère les cas où aucun individu n'est associé à un ticket. Les colonnes facultatives offrent une flexibilité dans la gestion des virgules de début.

Solution Oracle

Oracle propose une solution plus concise en utilisant la fonction LISTAGG() :

<code class="language-sql">SELECT TicketID,
       LISTAGG(Person, ',') WITHIN GROUP (ORDER BY Person) OVER (PARTITION BY TicketID) AS People
  FROM @Tickets</code>
Copier après la connexion

LISTAGG() regroupe directement les valeurs dans une liste séparée par des virgules, classées par colonne Person. La clause PARTITION BY garantit que l'agrégation se produit pour chaque TicketID distinct. Cette méthode est nettement plus simple et plus efficace que son équivalent SQL Server.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal