Dies könnte der sauberere Ansatz sein, den Sie suchen. Überprüfen Sie grundsätzlich, ob die Variable noch initialisiert wurde. Wenn dies nicht der Fall ist, setzen Sie es auf die leere Zeichenfolge und fügen Sie die erste Stadt hinzu (kein führendes Komma). Wenn dies der Fall ist, fügen Sie ein Komma und dann die Stadt hinzu.
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Dies funktioniert natürlich nur zum Auffüllen einer Variablen pro Status. Wenn Sie die Liste für jeden Status einzeln abrufen, gibt es eine bessere Lösung auf einen Schlag:
SELECT [state], cities = STUFF((
SELECT N', ' + city FROM dbo.tbl
WHERE [state] = x.[state]
FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];
Ergebnisse:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
So bestellen Sie nach dem Namen der Stadt in jedem Bundesland:
SELECT [state], cities = STUFF((
SELECT N', ' + city FROM dbo.tbl
WHERE [state] = x.[state]
ORDER BY city
FOR XML PATH(''), TYPE).value(N'.[1]', N'nvarchar(max)'), 1, 2, N'')
FROM dbo.tbl AS x
GROUP BY [state]
ORDER BY [state];
In Azure SQL-Datenbank oder SQL Server 2017+ können Sie die neue STRING_AGG()
Funktion verwenden :
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Und geordnet nach Städtenamen:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];