在SQL中为混合值和特定逗号分隔值拆分字符串?
如何在SQL Server 2012中拆分此类表的字符串:在SQL中为混合值和特定逗号分隔值拆分字符串?,sql,sql-server,string,Sql,Sql Server,String,如何在SQL Server 2012中拆分此类表的字符串: | ID | Data | +-----+----------+ | 1 | abc,def | | 2 | def,abc | | 3 | def,ghi | 为此: | ID | Data1 | Data2| Data3 | +-----+-------+------+-------+ | 1 | abc | def | null | | 2 | abc | def | nu
| 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 |
我的目标是将所有abc的| def | ghi放入它们自己的列中。使用一个#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);
这背后的逻辑是什么?为什么最后一行的
Data1
是NULL
?我想知道如何从一列中的字符串中提取一个特定的值,例如仅“def”,然后将其放入一个单独的列中,这是可能的吗?@Sharvil Popli-你的意思是,你想存储所有abc应该进入列Data1的值,def到列数据2,ghi到列数据3?所有这些abc,def和ghi都是一些特殊的不同值?比如说,我有两行具有不同ID的值abc,def和第二行def,ghi。是否可以将此列拆分为三列,分别显示abc、def、ghi,其余为空。我知道有些函数可以将字符串拆分为列,使用逗号作为值的锚点,如abc,def代表第一行和abc,def代表第二行,但如果我们有abc,def和def,abc呢。如何让abc和def进入他们自己的专栏?谢谢约翰,你是冠军!你知道网上有什么好的资源可以让我学习如何创建这样的代码吗?
ID Data1 Data2 Data3
1 abc def NULL
2 abc def NULL
3 NULL def ghi