2017-02-14 2 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 

Каждая запись, что у меня будет массив таким образом, как это, хотя иногда пре или корма будет пустым. Я попытался спуститься по пути функции split, но я не могу заставить свои данные выглядеть так, как я хочу, кто-нибудь сделал что-то подобное, прежде чем это может помочь.

Благодаря

+0

Почему вы пытаетесь кормить данных SQL Server таким образом, в первую очередь? – iamdave

+0

К сожалению, данные массива уже хранятся таким образом в базе данных/таблице и сделаны нашей командой разработчиков веб-разработчиков за рубежом, меня просто спросили, есть ли способ проанализировать ее так, как я описал. – PJD

+0

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

ответ

0

Это очень, очень, очень не лучший способ сделать это. Сложная манипуляция строк - одна из худших вещей, которые вы можете попробовать сделать в 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") | 
+-------------------------------+---------------------+----------------------+----------------------------------------------------------------------------------------------------+ 
+0

Привет iamdave, хотя это полезная вещь, чтобы знать и дает мне что-то поиграть. Я ясно дал понять нашей команде разработчиков, что это не то, что должно быть сделано на заднем конце, и я полностью согласен с тем, откуда вы пришли. Большое спасибо за помощь в этом, он был высоко оценен и что-то новое для изучения. – PJD

Смежные вопросы