SQL Server将逗号分隔的字符串排在一列中

时间:2016-11-23 16:42:12

标签: sql-server tsql

如何在varchar列中进行排序?

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

国家/地区列可能包含

"Russia, USA, France, UK, Japan, Russia, France, China".

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

最后,我想得到:

"China, France, Japan, Russia, UK, USA"
<国家/地区]栏中的

2 个答案:

答案 0 :(得分:1)

您需要使用此处的split string function之一,然后再将它们合并..

declare @string varchar(max)
set @string='Russia, USA, France, UK, Japan, Russia, France, China'

;with cte
as
(
select *
from [dbo].[SplitStrings_Numbers](@string,',')
)
select stuff( (select ',' +item 
from cte
order by item
for xml path('')),1,1,'')

答案 1 :(得分:1)

正如旁注:如果@string不提供任何特殊的XML字符,那么TheGameiswar发布的内容将会很有效。如果确实如此,您需要做一个小调整。这个:

for xml path('')),1,1,'')

需要成为这个:

for xml path(''),TYPE).value('.', 'varchar(1000)'),1,1,'');

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

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,'');

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

编辑:我忘了提及 - &#34; splitter&#34;我使用的是来自这篇文章:http://www.sqlservercentral.com/articles/Tally+Table/72993/