我正在努力实现以下目标:
California | Los Angeles, San Francisco, Sacramento
Florida | Jacksonville, Miami
Run Code Online (Sandbox Code Playgroud)
不幸的是,我得到了“,洛杉矶,旧金山,萨克拉门托,杰克逊维尔,迈阿密”
我可以使用 STUFF 函数实现我想要的结果,但想知道是否有使用 COALESCE 更简洁的方法?
STATE | CITY
California | San Francisco
California | Los Angeles
California | Sacramento
Florida | Miami
Florida | Jacksonville
DECLARE @col NVARCHAR(MAX);
SELECT @col= COALESCE(@col, '') + ',' + city
FROM tbl where city = 'California';
SELECT @col;
Run Code Online (Sandbox Code Playgroud)
谢谢
Aar*_*and 48
这可能是您所追求的更清洁的方法。基本上,检查变量是否已初始化。如果没有,请将其设置为空字符串,并附加第一个城市(无前导逗号)。如果有,则附加一个逗号,然后附加城市。
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Run Code Online (Sandbox Code Playgroud)
当然,这仅适用于为每个状态填充变量。如果您一次为每个状态拉一个列表,则有一个更好的解决方案:
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];
Run Code Online (Sandbox Code Playgroud)
结果:
DECLARE @col nvarchar(MAX);
SELECT @col = COALESCE(@col + ',', '') + city
FROM dbo.tbl WHERE state = 'California';
Run Code Online (Sandbox Code Playgroud)
要按每个州内的城市名称排序:
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];
Run Code Online (Sandbox Code Playgroud)
在 Azure SQL 数据库或 SQL Server 2017+ 中,您可以使用新STRING_AGG()功能:
SELECT [state], cities = STRING_AGG(city, N', ')
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Run Code Online (Sandbox Code Playgroud)
并按城市名称排序:
SELECT [state], cities = STRING_AGG(city, N', ')
WITHIN GROUP (ORDER BY city)
FROM dbo.tbl
GROUP BY [state]
ORDER BY [state];
Run Code Online (Sandbox Code Playgroud)
小智 7
只是为了补充上面亚伦的答案......
请注意,ORDER BY仅包含查询中的最后一项可能会中断。就我而言,我没有分组,所以不确定这是否有所不同。我正在使用 SQL 2014。在我的例子中,我有类似 value1、value2、value3 的东西......但我在变量中的结果只是 value3。
亚伦评论说:
这已在 Connect 上至少报告了四次:
来自 Microsoft 的示例响应:
您看到的行为是设计使然。在带有 ORDER BY 子句的查询中使用赋值操作(在此示例中为串联)具有未定义的行为。
响应还引用了 KB 287515:
FOR XML PATH如果串联顺序很重要,当然,如果您想确保包含所有值,则解决方案是使用(Aaron 答案中的第二种方法)。另见:
nvarchar 连接/索引/nvarchar(max)堆栈上的莫名其妙的行为
| 归档时间: |
|
| 查看次数: |
185515 次 |
| 最近记录: |