2016-11-22 46 views
-4

我怎麼可以拆分在SQL Server 2012中的字符串這樣一個表:在SQL中對混合和特定逗號分隔值拆分字符串?

| ID | Data  | 
+-----+----------+ 
| 1 | abc,def | 
| 2 | def,abc | 
| 3 | def,ghi | 

到這一點:

| ID | Data1 | Data2| Data3 | 
+-----+-------+------+-------+ 
| 1 | abc | def | null | 
| 2 | abc | def | null | 
| 3 | null | def | ghi | 

我的目標是讓所有農行| def的| ghi成爲他們自己的專欄。

+2

這背後有什麼邏輯? – Jens

+0

爲什麼'Data1'對於最後一行是「NULL」? –

+0

我想知道如何從一列中的字符串中取出一個特定的值,例如'def'並將其放入一個單獨的列中,這可能嗎? –

回答

1

使用#Temp表來存儲解析結果。或許你可以遷移到CTE

Declare @YourTable table (ID int,Data varchar(max)) 
Insert Into @YourTable values 
(1,'abc,def'), 
(2,'def,abc'), 
(3,'def,ghi') 

Select A.ID 
     ,B.* 
     ,ColName = 'Data'+cast(DENSE_RANK() over (Order By RetVal) as varchar(25)) 
Into #Temp 
From @YourTable A 
Cross Apply (
       Select RetSeq = Row_Number() over (Order By (Select null)) 
        ,RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)'))) 
       From (Select x = Cast('<x>'+ Replace(A.Data,',','</x><x>')+'</x>' as xml).query('.')) as A 
       Cross Apply x.nodes('x') AS B(i) 
      ) B 


Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName(ColName) From #Temp For XML Path('')),1,1,'') 
Select @SQL = 'Select ID,' + @SQL + ' 
       From (Select ID,ColName,RetVal From #Temp) A 
       Pivot (max(RetVal) For ColName in (' + @SQL + ')) p' 

Exec(@SQL); 

返回

ID Data1 Data2 Data3 
1 abc  def  NULL 
2 abc  def  NULL 
3 NULL def  ghi 
+0

謝謝約翰,你是一個冠軍!你知道在線的任何好的資源,我可以學習如何創建這樣的代碼? –