2423 Stimmen

Verkettung von Text aus mehreren Zeilen in eine einzige Textzeichenfolge in SQL Server

Stellen Sie sich eine Datenbanktabelle mit Namen vor, die drei Zeilen umfasst:

Peter
Paul
Mary

Gibt es eine einfache Möglichkeit, dies in eine einzige Zeichenfolge von Peter, Paul, Mary ?

29 Stimmen

Für Antworten speziell zu SQL Server, versuchen Sie diese Frage .

22 Stimmen

Für MySQL, schauen Sie unter Gruppe_Konkat de 本答

33 Stimmen

Ich wünschte, die nächste Version von SQL Server würde eine neue Funktion zur eleganten Lösung der mehrzeiligen String-Verkettung ohne die Albernheit von FOR XML PATH bieten.

164voto

Darryl Hein Punkte 138311

In MySQL gibt es eine Funktion, GROUP_CONCAT() die es Ihnen ermöglicht, die Werte aus mehreren Zeilen zu verketten. Beispiel:

SELECT 1 AS a, GROUP_CONCAT(name ORDER BY name ASC SEPARATOR ', ') AS people 
FROM users 
WHERE id IN (1,2,3) 
GROUP BY a

0 Stimmen

Funktioniert grundsätzlich. Zwei Dinge sind zu beachten: 1) Wenn Ihre Kolumne nicht eine CHAR müssen Sie ihn z. B. über GROUP_CONCAT( CAST(id AS CHAR(8)) ORDER BY id ASC SEPARATOR ',') 2) Wenn Sie viele Werte haben, sollten Sie die group_concat_max_len wie geschrieben in stackoverflow.com/a/1278210/1498405

0 Stimmen

Das hat bei mir ab März 2022 funktioniert. Ich hatte Url's in Zeilen und wollte sie in einer einzigen Spalte haben und das hat funktioniert. Danke!

3 Stimmen

Der OP bezog sich auf [MS] SQL Server

74voto

pedram Punkte 6527

Verwenden Sie COALESCE - Weitere Informationen finden Sie hier

Ein Beispiel:

102

103

104

Schreiben Sie dann den folgenden Code in SQL Server,

Declare @Numbers AS Nvarchar(MAX) -- It must not be MAX if you have few numbers
SELECT  @Numbers = COALESCE(@Numbers + ',', '') + Number
FROM   TableName where Number IS NOT NULL

SELECT @Numbers

Die Ausgabe würde lauten:

102,103,104

4 Stimmen

Dies ist wirklich die beste Lösung IMO, da es die Kodierungsprobleme, die FOR XML präsentiert vermeidet. Ich benutzte Declare @Numbers AS Nvarchar(MAX) und es hat gut funktioniert. Können Sie bitte erklären, warum Sie empfehlen, es nicht zu verwenden?

12 Stimmen

Diese Lösung wurde bereits vor 8 Jahren veröffentlicht! stackoverflow.com/a/194887/986862

0 Stimmen

Warum gibt diese Abfrage ??? Symbole anstelle von kyrillischen Symbolen zurück? Ist dies nur ein Ausgabeproblem?

69voto

hgmnz Punkte 13020

PostgreSQL-Arrays sind großartig. Beispiel:

Erstellen Sie einige Testdaten:

postgres=# \c test
You are now connected to database "test" as user "hgimenez".
test=# create table names (name text);
CREATE TABLE
test=# insert into names (name) values ('Peter'), ('Paul'), ('Mary');
INSERT 0 3
test=# select * from names;
 name
-------
 Peter
 Paul
 Mary
(3 rows)

Aggregieren Sie sie in einem Array:

test=# select array_agg(name) from names;
 array_agg
-------------------
 {Peter,Paul,Mary}
(1 row)

Konvertiert das Array in eine durch Komma getrennte Zeichenkette:

test=# select array_to_string(array_agg(name), ', ') from names;
 array_to_string
-------------------
 Peter, Paul, Mary
(1 row)

DONE

Seit PostgreSQL 9.0 ist es sogar noch einfacher, zitiert aus der gelöschten Antwort von "horse with no name":

select string_agg(name, ',') 
from names;

2 Stimmen

Wenn Sie mehr als eine Spalte benötigen, zum Beispiel die Mitarbeiter-ID in Klammern, verwenden Sie den Operator concat: select array_to_string(array_agg(name||'('||id||')'

4 Stimmen

Nicht anwendbar auf sql-server nur, um mysql

51voto

Alex Punkte 9066

Oracle 11g Release 2 unterstützt die Funktion LISTAGG. Dokumentation aquí .

COLUMN employees FORMAT A50

SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM   emp
GROUP BY deptno;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

Warnung

Seien Sie vorsichtig bei der Implementierung dieser Funktion, wenn die resultierende Zeichenkette mehr als 4000 Zeichen umfassen kann. Sie wird eine Ausnahme auslösen. Wenn das der Fall ist, müssen Sie entweder die Ausnahme behandeln oder eine eigene Funktion entwickeln, die verhindert, dass die zusammengefügte Zeichenfolge mehr als 4000 Zeichen umfasst.

2 Stimmen

Für ältere Versionen von Oracle ist wm_concat perfekt. Seine Verwendung wird in dem Link-Geschenk von Alex erklärt. Danke Alex!

1 Stimmen

LISTAGG funktioniert perfekt! Lesen Sie einfach das hier verlinkte Dokument. wm_concat ab der Version 12c entfernt.

40voto

Yogesh Bhadauirya Punkte 1215

In SQL Server 2005 und höher verwenden Sie die folgende Abfrage, um die Zeilen zu verketten.

DECLARE @t table
(
    Id int,
    Name varchar(10)
)
INSERT INTO @t
SELECT 1,'a' UNION ALL
SELECT 1,'b' UNION ALL
SELECT 2,'c' UNION ALL
SELECT 2,'d' 

SELECT ID,
stuff(
(
    SELECT ','+ [Name] FROM @t WHERE Id = t.Id FOR XML PATH('')
),1,1,'') 
FROM (SELECT DISTINCT ID FROM @t ) t

2 Stimmen

Ich glaube, dies schlägt fehl, wenn die Werte XML-Symbole enthalten, wie < o & .

0 Stimmen

Funktioniert hervorragend, wie in den angegebenen Beispielen. Anstelle einer temporären Tabelle oder Variable habe ich CTE verwendet docs.microsoft.com/de-us/sql/t-sql/queries/

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X