2016-11-21 48 views
2

我有一个表,看起来像这样:SQL服务器:拆分柱为多列(表格式)

id   actions 
ua123  [{'type':'mobile'},{'action':'display conversion'}] 
ua234  [{'type':'DT'},{'action':'search'},{'value':'40'}] 

为什么这个表看起来这是因为信息是从网站抓取。我想将动作栏分成几列,如:

id   actions1     action2       action3 
ua123  [{'type':'mobile'} {'action':'display conversion'}]  Null 
ua234  [{'type':'DT'}  {'action':'search'}    {'value':'40'}] 

请随意分享任何灯光。谢谢!

回答

0

@johncappelletti谢谢您的回答,这给了我一些轻!

这是我用来解决我的问题的最终语法。

Declare @delimiter varchar(50) 
set @delimiter=' '; 

With Test1 as 
(Select id, 
     actions, 
     cast('<x>'+replace(actions,@delimiter,'<x></x>')+'</x>' as XML) 
     as Name_XML 
From tb1 
) 
Select id, 
     actions, 
     Name_XML.value('/x[1]','varchar(50)') as action1, 
     Name_XML.value('/x[2]','varchar(50)') as action2, 
     Name_XML.value('/x[3]','varchar(50)') as action3, 
     Name_XML.value('/x[4]','varchar(50)') as action4, 
     . 
     . 
     . 
     . 
From Test1 
3

假设你不想动态。 (如果需要零钱)

Select A.ID 
     ,B.* 
From YourTable A 
Cross Apply (
       Select actions1 = xDim.value('/x[1]','varchar(max)') 
         ,actions2 = '{'+xDim.value('/x[2]','varchar(max)') 
         ,actions3 = '{'+xDim.value('/x[3]','varchar(max)') 
       From (Select Cast('<x>' + Replace(A.Actions,',{','</x><x>')+'</x>' as XML) as xDim) A 
      ) B 

返回

ID  actions1   actions2       actions3 
ua123 [{"type":"mobile"} {"action":"display conversion"}] NULL 
ua234 [{"type":"DT"}  {"action":"search"}    {"value":"40"}] 
+0

谢谢你的回答。但是,当我在上面运行你的代码时。这些消息告诉我“Cannnot find data type'XML'”。我发现为什么发生这种情况的一个答案似乎是在2005/2008 sql服务器下兼容,而我正在使用2016.尽管如此,当我将脚本版本更改回2005/2008时,它仍然无法正常工作。有任何想法吗? –

+0

@ZedFang XML自2005年版本开始提供。我根本无法想象哪里出现错误。我会做更多的挖掘。 –

+0

听起来不错。无论如何,上面使用的解决方案仅适用于最初只有三个',''的列。但是,如果我不知道每行有多少'{',那么我怎么能自动将这些列分成几行,每行都是基于每一行?我习惯于在** postgresql **下使用** split_part **,它会自动检测分隔符。我不相信sql server也有这个功能。 –