2016-11-21 37 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也有這個功能。 –