wake-up-neo.com

SQL, wie Ergebnisse verketten?

Ich habe derzeit eine SQL-Abfrage, die eine Reihe von Feldern zurückgibt. Ich brauche eines der Felder, um effektiv eine Unterabfrage zu sein.

Das Problem im Detail:

Wenn ich eine Tabelle X mit zwei Spalten habe, "ModuleID" und "ModuleValue", wie kann ich eine SQL-Abfrage schreiben, um die Ergebnisse zu übernehmen und in ein Feld zu verketten:

ZB Ergebnisse zurückgegeben von

 (SELECT ModuleValue FROM Table_X WHERE [email protected])

Wert 1

Wert 2

Wert 3

...

Ich muss das Ergebnis wie folgt zurückgeben (im Gegensatz zu der obigen Zeile als einzelne Zeile):

Wert 1, Wert 2, Wert 3

Gibt es eine einfache Verkettungsmethode, die Benutzer sein könnte?

EDIT:

DB ist MS TSQL (2005)

30
Darknight

Mit MSSQL können Sie Folgendes tun:

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

Dieses schließt automatisch das nachgestellte Komma aus, im Gegensatz zu den meisten anderen Antworten.

DECLARE @csv VARCHAR(1000)

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

(Wenn die ModuleValue -Spalte noch kein String-Typ ist, müssen Sie sie möglicherweise in einen VARCHAR umwandeln.)

35
LukeH

In MySQL würden Sie die folgende Funktion verwenden:

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

Ich bin nicht sicher, welchen Dialekt Sie verwenden.

11

In SQL Server 2005 und höher können Sie Folgendes tun:

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

Dies sollte Ihnen etwas geben, was Sie suchen.

Marc

9
marc_s

Meiner Meinung nach ist die Verwendung von STRING_AGG( ... ) die beste Lösung:

Mehr bei:

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

4
sdsc81

Dies hängt von der verwendeten Datenbank ab. MySQL unterstützt zum Beispiel die (nicht standardmäßige) group_concat Funktion. Sie könnten also schreiben:

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

Group-concat ist jedoch nicht auf allen Datenbankservern verfügbar.

3
idrosid

Kleines Update zu Marc, wir werden am Ende ein zusätzliches "," haben. Ich habe Stuff-Funktion verwendet, um zusätzliches Semikolon zu entfernen.

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