SQL Server 对一列中的逗号分隔字符串进行排序

Mel*_*ang 5 t-sql sql-server

如何在varchar列中排序?

比如我有一个名为 的列[Country],它可能包含各种国家名称。

国家/地区列可能包含

"Russia, USA, France, UK, Japan, Russia, France, China".
Run Code Online (Sandbox Code Playgroud)

如何区分 [Country] 列并按字母顺序对字符串进行排序?

最后,我想得到:

"China, France, Japan, Russia, UK, USA"
Run Code Online (Sandbox Code Playgroud)

在[国家]栏中。

Ala*_*ein 1

顺便说一句:如果 @string 不包含任何特殊的 XML 字符,那么 TheGameiswar 发布的内容将会很好地工作。如果确实如此,您将需要进行一些小的调整。这:

for xml path('')),1,1,'')
Run Code Online (Sandbox Code Playgroud)

需要变成这样:

for xml path(''),TYPE).value('.', 'varchar(1000)'),1,1,'');
Run Code Online (Sandbox Code Playgroud)

考虑以下查询以及我的评论:

declare @string varchar(max)
set @string='<tag3>,<tag1>,<tag2>';

-- Note the output here:
;with cte
as
(
select *
from dbo.delimitedSplit8K(@string,',')
)
select stuff( (select ',' +item 
from cte
order by item
for xml path('')),1,1,'');

-- this will handle special XML characters:
WITH cte
as
(
select *
from dbo.delimitedSplit8K(@string,',')
)
select stuff( (select ',' +item 
from cte
order by item
for xml path(''),TYPE).value('.', 'varchar(1000)'),1,1,'');
Run Code Online (Sandbox Code Playgroud)

我所展示的更改会稍微降低性能,但可以正确处理特殊 XML 字符。

编辑:我忘了提及 - 我使用的“拆分器”来自这篇文章:http://www.sqlservercentral.com/articles/Tally+Table/72993/