2016-11-23 317 views
1

如何在varchar列中排序?SQL Server在一列中對逗號分隔的字符串進行排序

如我有一個名爲[Country]的專欄,它可能包含各種國名。

國家列可能包含

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

我如何不同[國家]列內按字母順序排序的字符串?

最後,我想:

"China, France, Japan, Russia, UK, USA" 
在[國家]列

+0

對付絕對的最佳方法是停止餡多個值到一個單一的元組。這違反了1NF,導致難以置信的痛苦。 –

回答

1

:如果提供了什麼TheGameiswar發佈將工作得很清楚,@string不要」 t支持任何特殊的XML字符。如果是這樣,你需要做一個小調整。這:

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字符。

編輯:我忘了mention-了「分流」我現在用的就是從這篇文章:http://www.sqlservercentral.com/articles/Tally+Table/72993/

+0

delimitedSplit8K? –

+0

我的壞!我忘了提及,我在這裏使用的「splitter」功能是Jeff Moden的DelimitedSplit8K:http://www.sqlservercentral.com/articles/Tally+Table/72993/ –

+0

我喜歡這個答案。謝謝。我需要在查詢中添加不同的內容。 –

1

您將需要使用split string function S的一個從這裏,然後再結合他們..正如一個側面說明

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,'') 
相關問題