web-dev-qa-db-fra.com

SQL, comment concaténer les résultats?

J'ai actuellement une requête SQL qui renvoie un certain nombre de champs. J'ai besoin d'un f des champs pour être effectivement un sous-sous-requête.

Le problème en détail:

Si j'ai une table X avec deux colonnes, ModuleID et disons ModuleValue, comment puis-je écrire une requête SQL pour prendre les résultats et les concaténer dans un champ:

PAR EXEMPLE Résultats renvoyés par

 (SELECT ModuleValue FROM Table_X WHERE ModuleID=@ModuleID)

Valeur 1

Valeur 2

Valeur 3

...

Je dois retourner le résultat ainsi (comme une seule ligne, contrairement à ce qui précède):

Valeur 1, valeur 2, valeur 3

Existe-t-il une méthode de concaténation simple pouvant être utilisée par l'utilisateur?

MODIFIER:

DB est MS TSQL (2005)

30
Darknight

Avec MSSQL, vous pouvez faire quelque chose comme ceci:

declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', ' 
from TableX where ModuleId = @ModuleId
33
Blorgbeard

Celui-ci exclut automatiquement la virgule de fin, contrairement à la plupart des autres réponses.

DECLARE @csv VARCHAR(1000)

SELECT @csv = COALESCE(@csv + ',', '') + ModuleValue
FROM Table_X
WHERE ModuleID = @ModuleID

(Si la colonne ModuleValue n'est pas déjà un type de chaîne, vous devrez peut-être la convertir en VARCHAR.)

35
LukeH

Dans mysql, vous utiliseriez la fonction suivante:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE ModuleID=@ModuleID

Je ne sais pas quel dialecte vous utilisez.

11
Silvan Mühlemann

Dans SQL Server 2005 et versions ultérieures, vous pouvez faire quelque chose comme ceci:

SELECT 
    (SELECT ModuleValue + ','
     FROM dbo.Modules
     FOR XML PATH('')
    ) 
FROM dbo.Modules
WHERE ModuleID = 1

Cela devrait vous donner quelque chose comme ce que vous recherchez.

Marc

9
marc_s

À mon avis, utiliser STRING_AGG( ... ) est la meilleure solution:

Plus à:

https://stackoverflow.com/a/42778050/1260488

4
sdsc81

Cela dépend de la base de données que vous utilisez. MySQL par exemple prend en charge la fonction (non standard) group_concat . Vous pouvez donc écrire:

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE ModuleID=@ModuleID

Cependant, Group-concat n'est pas disponible sur tous les serveurs de base de données.

3
idrosid

Petite mise à jour sur Marc nous aurons des "," supplémentaires à la fin. j'ai utilisé la fonction stuff pour supprimer le point-virgule supplémentaire.

       SELECT STUFF((  SELECT ',' + ModuleValue AS ModuleValue
                           FROM ModuleValue WHERE ModuleID=@ModuleID
                      FOR XML PATH('') 
                     ), 1, 1, '' )
2
sandeep rawat