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)
Avec MSSQL, vous pouvez faire quelque chose comme ceci:
declare @result varchar(500)
set @result = ''
select @result = @result + ModuleValue + ', '
from TableX where ModuleId = @ModuleId
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
.)
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.
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
À mon avis, utiliser STRING_AGG( ... )
est la meilleure solution:
Plus à:
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.
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, '' )