23

J'ai actuellement une requête SQL qui retourne un certain nombre de champs. J'ai besoin d'un f les champs pour être effectivement un sub sub query.SQL, comment concaténer les résultats?

Le problème en détail:

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

EG résultats renvoyés par

(SELECT ModuleValue FROM Table_X WHERE [email protected]) 

Valeur 1

Valeur 2

Valeur 3

...

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

Valeur 1, valeur 2, valeur 3

Y at-il un méthode de concaténation simple qui pourrait être l'utilisateur?

EDIT:

DB est MS TSQL (2005)

+0

Êtes-vous Voulant simplement récupérer les données ou mettre à jour un autre champ avec il? – Evernoob

+0

Juste récupération, également son MS TSQL – Darknight

Répondre

26

Avec MSSQL vous pouvez faire quelque chose comme ceci:

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

Merci! Je vais essayer maintenant, je vous répondrai si cela fonctionne. – Darknight

+0

C'est ce que je cherchais à travailler très bien, merci beaucoup! – Darknight

+1

SELECT GAUCHE (@ result, LEN (@result) -1) AS Txt – suiwenfeng

10

Dans MySQL, vous devriez utiliser la fonction suivante:

SELECT GROUP_CONCAT(ModuleValue, ",") FROM Table_X WHERE [email protected] 

Je ne suis pas sûr du dialecte que vous utilisez.

+0

Associé puisqu'il m'a été utile: http://stackoverflow.com/questions/2567000/mysql-and-group-concat-maximum-length – starryknight64

3

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

SELECT GROUP_CONCAT(ModuleValue) FROM Table_X WHERE [email protected] 

La concatation de groupe n'est cependant pas disponible sur tous les serveurs de base de données.

6

Dans SQL Server 2005 et, vous pourriez 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 cherchez.

Marc

+0

semble intéressant, n'ont pas beaucoup utilisé le chemin XML. Je vais certainement jouer avec celui-ci. Merci! – Darknight

31

Celui-ci exclut automatiquement la virgule finale, 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 est pas déjà un type de chaîne alors vous pourriez avoir besoin de le jeter à un VARCHAR.)

+0

Bien noté, dans ce cas c'était un varchar, mais dans d'autres cas, cette coule serait bien d'autres types de valeur. – Darknight

0

Petite mise à jour sur Marc, nous aurons plus « » au fin. J'ai utilisé la fonction stuff pour enlever le point-virgule supplémentaire.

 SELECT STUFF(( SELECT ',' + ModuleValue AS ModuleValue 
          FROM ModuleValue WHERE [email protected] 
         FOR XML PATH('') 
        ), 1, 1, '')