這是非常,非常,非常不是最好的方式做到這一點。複雜的字符串操作是你可以嘗試在SQL Server中做的最糟糕的事情之一。在你的整個項目用你的問題中的愚蠢的設計選擇來存儲之前,將你的開發團隊整理出來。
這一邊,因爲我在工作無聊,我決定向你展示嘗試只是多麼愚蠢做,這是在SQL。下面的示例適用於您的示例數據,但在主機pre
和aft
值上可能會失敗。例如,如果您的數據中有任何charindex
或patindex
匹配模式。
利用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") |
+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+
爲什麼你想以這種方式首先養活SQL Server數據? – iamdave
不幸的是,陣列數據已經以這種方式存儲在數據庫/表中,並且由我們的海外Web開發團隊完成,我剛纔被問到是否有一種方法可以用我描述的方式解析它。 – PJD
我強烈建議你告訴他們這不是一個適合於SQL Server的任務,而且他們應該真的改變他們的數據導入方法。你也應該明智地解釋你想要這些數據去哪裏?假設每個數組都是不同的表,給定'for'和'aft'值集內的不同數據類型?根據表和列,您希望得到的輸出是什麼?這也有助於瞭解空白的「前」或「後」值的外觀。 – iamdave