Это очень, очень, очень не лучший способ сделать это. Сложная манипуляция строк - одна из худших вещей, которые вы можете попробовать сделать в 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
К сожалению, данные массива уже хранятся таким образом в базе данных/таблице и сделаны нашей командой разработчиков веб-разработчиков за рубежом, меня просто спросили, есть ли способ проанализировать ее так, как я описал. – PJD
Я настоятельно рекомендую вам сказать, что это не задача, подходящая для SQL Server, и что они должны действительно изменить способ импорта данных. Вам также было бы разумно объяснить, куда вы хотите, чтобы эти данные шли? Я предполагаю, что каждый массив является другой таблицей, учитывая разные типы данных в наборах значений 'for' и' aft'? Каков ваш желаемый результат с точки зрения таблиц и столбцов? Это также поможет увидеть, как выглядит пустое значение 'pre' или' aft'. – iamdave