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
?
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
?
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
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
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!
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
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?
Diese Lösung wurde bereits vor 8 Jahren veröffentlicht! stackoverflow.com/a/194887/986862
Warum gibt diese Abfrage ??? Symbole anstelle von kyrillischen Symbolen zurück? Ist dies nur ein Ausgabeproblem?
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;
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||')'
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.
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.
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
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 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.
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.
1 Stimmen
Schritt-für-Schritt-Anleitung für die Beschreibung der obigen Antworten: versuchen Sie diesen Artikel: [ sqlmatters.com/Artikel/ ]
4 Stimmen
Nicht SQL, aber wenn es sich um eine einmalige Sache handelt, können Sie die Liste in dieses Browser-Tool einfügen convert.town/Spalte-zu-Komma-getrennte-Liste
4 Stimmen
In Oracle können Sie LISTAGG(COLUMN_NAME) aus 11g r2 verwenden, davor gibt es eine nicht unterstützte Funktion namens WM_CONCAT(COLUMN_NAME), die dasselbe tut.
0 Stimmen
Diese CLR-Lösung, die direkt eingesteckt werden kann, ist so etwas wie mein Sql GROUP_CONCAT, aquí
0 Stimmen
Sie können die Funktion zur Verkettung von Zeichenfolgen verwenden. Ich kann die Antwort nicht hinzufügen (da sie gesperrt ist), also füge ich sie hier ein:
DECLARE @big_string varchar(max) = ''; SELECT @big_string += x.s + ',' FROM (VALUES ('string1'), ('string2'), ('string3')) AS x(s);
. Zeigen Sie nun das Ergebnis:SELECT @big_string;
. So einfach ist das.0 Stimmen
SELECT Haupt.FachID, LEFT(Haupt.Schüler,Len(Haupt.Schüler)-1) As "Schüler" FROM ( SELECT DISTINCT ST2.FachID, ( SELECT ST1.Schülername + ',' AS [text()] FROM dbo.Schüler ST1 WHERE ST1.FachID = ST2.FachID ORDER BY ST1.FachID FOR XML PATH ('') ) [Schüler] FROM dbo.Schüler ST2 ) [Haupt]
0 Stimmen
SQL-Lizenzen kosten 20 Mal mehr als normale Windows-Lizenzen. Wenn möglich, führen Sie die Datenverarbeitung mit einer CPU durch, für die Sie viel weniger bezahlen, z. B. mit dem Webserver.