Я предполагаю, что причина, по которой данные должны быть проанализированы на сервере, состоит в том, чтобы использовать их в запросе большего размера.В противном случае нет причин анализировать его на сервере.Это было бы намного проще сделать в C #, например, с помощью регулярного выражения.
Не зная, какой это SQL Server, я просто предположу, что это 2016 или более поздняя версия, потому что это позволяет нам преобразовать строкув значение JSON путем замены \
на ":"
и ;
на ","
.Аналогичная методика может использоваться в более старых версиях для преобразования строки в XML.
Предполагается, что эта простая таблица:
declare @table table (id int identity primary key,col varchar(max))
insert into @table (col)
values ('Green/1051;Brown/1258;Red/1110;Yellow /1024;Red/1147;')
Мы можем использовать STUFF(col,len(col),1,'')
для удаления завершающей точки с запятой.Этот запрос:
select stuff(col,len(col),1,'')
from @table
Дает
Green/1051;Brown/1258;Red/1110;Yellow /1024;Red/1147
Замена /
и ;
на
select replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","')
from @table
Дает:
Green":"1051","Brown":"1258","Red":"1110","Yellow ":"1024","Red":"1147
Нам просто нужно завершить строку JSON, окружив это значение {"
и "}
.
. Как только мы сделаем это, мы можем использовать OPENJSON:
select *
from @table
cross apply openjson('{"' + replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}')
Это вернетстолбцы id
, col
из исходной таблицы и столбцы key
, value
и type
из OPENJSON:
select id,[key],value
from @table
cross apply openjson('{"' +
replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}') x
Вернет:
id key value
1 Green 1051
1 Brown 1258
1 Red 1110
1 Yellow 1024
1 Red 1147
Мы можем объединить эти результаты с другой таблицей.Скажем, эти числа являются идентификаторами предметов, и у нас есть таблица инвентаря с суммами в запасах для каждого:
declare @inventory table (colorid int,amount int)
insert into @inventory (colorid,amount)
values
(1051,5),
(1258,10),
(1110,24),
(1024,2),
(1147,22)
Какие предметы имеют сумму выше 20?
select id, [key],colorid,amount
from @table
cross apply openjson('{"' + replace(replace(stuff(col,len(col),1,''),'/','":"'),';','","') + '"}') x
inner join @inventory i on i.colorid=x.value
where amount>20
Результатэто:
id key colorid amount
1 Red 1110 24
1 Red 1147 22