Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中为混合值和特定逗号分隔值拆分字符串?_Sql_Sql Server_String - Fatal编程技术网

在SQL中为混合值和特定逗号分隔值拆分字符串?

在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

如何在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  |  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