在SQL中更新JSON数组中的现有JSON值

San*_*anu 3 sql t-sql sql-server json

我想更新JSON数组中的现有JSON值。我可以使用将新的JSON附加到JSON数组JSON_MODIFY。假设我有一个类似JSON:

[{"id":"101","name":"John"}, {"id":"102","name":"peter"}]
Run Code Online (Sandbox Code Playgroud)

但是我只想更新id = 102的json。

有可能使用JSON_MODIFY()吗?

编辑

实际数据

{"Details":{"SId":{"Type":"string","Value":"1234"},"BookList":{"Type":"List","Value":[{"id": "101", "name": "Book1"},{"id": "102", "name": "Book2"}]},"SName":{"Type":"string","Value":"john"}}}
Run Code Online (Sandbox Code Playgroud)

Luk*_*zda 6

您可以使用CTE它来解析并UPDATE部分合并路径:

WITH cte AS (
  SELECT *
  FROM t
  CROSS APPLY OPENJSON(c) s
  WHERE i = 1
    AND JSON_VALUE(s.value, '$.id')=102
)
UPDATE cte
SET c = JSON_MODIFY(c, '$[' + cte.[key] + '].name', 'Joe');
Run Code Online (Sandbox Code Playgroud)

DBFiddle演示

输出:

-- Before
[{"id":"101","name":"John"}, {"id":"102","name":"peter"}]

-- After
[{"id":"101","name":"John"}, {"id":"102","name":"Joe"}]
Run Code Online (Sandbox Code Playgroud)

这将在SQL Server 2017+或SQL Azure DB上运行,否则会出现错误。有关路径文字的更多信息

  • @Jishad,您可以生成更新语句。像`select'update [yourtable] set [jsoncol] = json_modify([jsoncol],``$ ['+ [key] +'] .name'',``Joe'')之类的东西,其中id ='+ [yourtable来自[yourtable]的] .id交叉应用openjson([jsoncol])`,然后使用sp_executesql执行所有命令(当然,要警惕sql注入) (2认同)
  • 不敢相信我为寻找这个答案付出了多少努力,非常爱 (2认同)