如何使用JSON_MODIFY更新数组中符合某些条件的所有元素

时间:2017-06-07 04:43:32

标签: arrays json tsql

我有一个带有json列的表,而json包含一个项目数组。我想更新一些满足给定标准的项目。因此,数组的路径为$.activities,其中type为'multichoice i want to set 'data.insightsTitledata.title

似乎无论如何都没有查询路径(就像好的'xpath),所以我一直在摸不着头脑。

1 个答案:

答案 0 :(得分:1)

我想出了这个解决方案,似乎工作并且不太严重!它需要一个循环,因为它正在为匹配的每个数组项写入json列。

begin tran t1

DECLARE @Count int = -1

while @Count != 0
begin
update dp
    set definition = JSON_MODIFY(dp.definition, '$.activities[' + (CAST(src.[key] as nvarchar(6)) COLLATE SQL_Latin1_General_CP1_CI_AS) + ']', JSON_MODIFY(src.value, '$.data.insightsTitle', JSON_VALUE(src.value, '$.data.title')))
from
    deviceprofile dp
join (
select dp.deviceprofileid, g.*--dp.definition
from deviceprofile dp
CROSS APPLY OPENJSON(dp.definition, '$.activities') g
) src on dp.deviceprofileid = src.deviceprofileid
where JSON_VALUE(src.value, '$.type') = 'multichoice' and JSON_VALUE(src.value, '$.data.insightsTitle') is null

select @count = count(distinct dp.deviceprofileid)
from deviceprofile dp
CROSS APPLY OPENJSON(dp.definition, '$.activities') WITH (type nvarchar(100), insightsTitle nvarchar(256) '$.data.insightsTitle') g
where g.type = 'multichoice' and g.insightsTitle is null

print @count
end

rollback tran

因此,如果你没有指定WITH,你会得到这个神奇的Key列,它为你提供索引和数组项的完整json。然后,您只更新该块并使用它们键来为每个匹配的数组项逐个更新整个json字符串。享受。