นี่อาจเป็นวิธีที่สะอาดกว่าที่คุณต้องการ ตรวจสอบว่าตัวแปรนั้นได้รับการเริ่มต้นหรือยัง หากไม่มีให้ตั้งเป็นสตริงว่างและต่อท้ายเมืองแรก (ไม่มีเครื่องหมายจุลภาคชั้นนำ) ถ้ามีให้ต่อท้ายคอมมาแล้วต่อท้ายเมือง
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
แน่นอนว่าใช้ได้กับการเติมตัวแปรต่อสถานะเท่านั้น หากคุณกำลังดึงรายการสำหรับแต่ละรัฐทีละรายการมีทางออกที่ดีกว่าในนัดเดียว:
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];
ผล:
state cities
---------- --------------------------------------
California San Francisco, Los Angeles, Sacramento
Florida Miami, Jacksonville
หากต้องการจัดเรียงตามชื่อเมืองภายในแต่ละรัฐ:
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];
ใน Azure SQL Database หรือ SQL Server 2017+ คุณสามารถใช้ฟังก์ชันใหม่STRING_AGG()
:
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
และเรียงตามชื่อเมือง:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];