2017-02-14 62 views
0

我有一些麻煩,試圖分裂出來,我已經存儲在SQL表字段的「SQL Server 2014」數組的字符串。表函數解析出數組數據

我的數據看起來像

array(
          "status"=>array("pre"=>"2","aft"=>1) 
          "tier_ppl"=>array("pre"=>5.00,"aft"=>5.00) 
          "tier_commission"=>array("pre"=>5.00,"aft"=>500.00) 
          "tier_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-14 08:54:32") 
          "affiliate_commission"=>array("pre"=>4.00,"aft"=>4.00) 
          "affiliate_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-10 12:30:59") 
         ) 

,我需要讓我出去放像: -

arrayname      pre       aft 

status       5.00       5.00 

tier_ppl      5.00       500.00 

tier_commission    5.00       500.00 

tier_commission_datetime  2017-02-10 12:30:59   2017-02-14 08:54:32 

affiliate_commission   4.00       4.00 

affiliate_commission_datetime 2017-02-10 12:30:59   2017-02-10 12:30:59 

每當我有將會有一個數組像這樣的記錄,雖然有時預或者尾部將是空白的。我已經嘗試了拆分函數路線,但我無法使我的數據看起來像我想要的樣子,有沒有人做過這樣的事情之前,可以幫助請。

感謝

+0

爲什麼你想以這種方式首先養活SQL Server數據? – iamdave

+0

不幸的是,陣列數據已經以這種方式存儲在數據庫/表中,並且由我們的海外Web開發團隊完成,我剛纔被問到是否有一種方法可以用我描述的方式解析它。 – PJD

+0

我強烈建議你告訴他們這不是一個適合於SQL Server的任務,而且他們應該真的改變他們的數據導入方法。你也應該明智地解釋你想要這些數據去哪裏?假設每個數組都是不同的表,給定'for'和'aft'值集內的不同數據類型?根據表和列,您希望得到的輸出是什麼?這也有助於瞭解空白的「前」或「後」值的外觀。 – iamdave

回答

0

這是非常,非常,非常不是最好的方式做到這一點。複雜的字符串操作是你可以嘗試在SQL Server中做的最糟糕的事情之一。在你的整個項目用你的問題中的愚蠢的設計選擇來存儲之前,將你的開發團隊整理出來。

這一邊,因爲我在工作無聊,我決定向你展示嘗試只是多麼愚蠢做,這是在SQL。下面的示例適用於您的示例數據,但在主機preaft值上可能會失敗。例如,如果您的數據中有任何charindexpatindex匹配模式。

利用Jeff Moden's string splitting function,你可以做到以下幾點:

declare @a nvarchar(1000) = 
'array(
"status"=>array("pre"=>"2","aft"=>1) 
"tier_ppl"=>array("pre"=>5.00,"aft"=>5.00) 
"tier_commission"=>array("pre"=>5.00,"aft"=>500.00) 
"tier_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-14 08:54:32") 
"affiliate_commission"=>array("pre"=>4.00,"aft"=>4.00) 
"affiliate_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-10 12:30:59") 
)'; 

select replace(left(s.Item,charindex('"=',s.Item,1)),'"','') as arrayname 
    ,replace(replace(substring(s.Item,charindex('"pre"=>',s.Item,1),patindex('%,"%',s.Item) - charindex('"pre"=>',s.Item,1)),'"pre"=>',''),'"','') as Pre 
    ,reverse(replace(replace(left(reverse(s.Item),charindex('>=',reverse(s.Item),1)-1),')',''),'"','')) as Aft 
    ,s.Item 
from dbo.DelimitedSplit8K(@a,char(10)) s 
where left(Item,1) = '"'; 

將輸出:

+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+ 
|   arrayname   |   Pre   |   Aft   |            Item            | 
+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+ 
| status      | 2     | 1     | "status"=>array("pre"=>"2","aft"=>1)                | 
| tier_ppl      | 5.00    | 5.00     | "tier_ppl"=>array("pre"=>5.00,"aft"=>5.00)               | 
| tier_commission    | 5.00    | 500.00    | "tier_commission"=>array("pre"=>5.00,"aft"=>500.00)            | 
| tier_commission_datetime  | 2017-02-10 12:30:59 | 2017-02-14 08:54:32 | "tier_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-14 08:54:32")  | 
| affiliate_commission   | 4.00    | 4.00     | "affiliate_commission"=>array("pre"=>4.00,"aft"=>4.00)            | 
| affiliate_commission_datetime | 2017-02-10 12:30:59 | 2017-02-10 12:30:59 | "affiliate_commission_datetime"=>array("pre"=>"2017-02-10 12:30:59","aft"=>"2017-02-10 12:30:59") | 
+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+ 
+0

嗨iamdave,雖然這是一個有用的事情,給我的東西玩我已經說得很清楚,我們的開發團隊,這是不是一件應該在後臺完成,我完全同意你來自哪裏。非常感謝你對此的幫助,我們非常感謝你,並且學到了一些新東西。 – PJD