【问题标题】:Update an existing JSON value inside a JSON Array in SQL在 SQL 中更新 JSON 数组中的现有 JSON 值
【发布时间】:2021-06-10 21:38:17
【问题描述】:

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

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

但我只想更新 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"}}}

【问题讨论】:

  • 请不要以使现有答案无效的方式编辑问题。如果您需要添加一些详细信息,请清楚标记或提出新问题

标签: sql json sql-server tsql


【解决方案1】:

您可以使用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');

DBFiddle Demo

输出:

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

-- After
[{"id":"101","name":"John"}, {"id":"102","name":"Joe"}]

这适用于 SQL Server 2017+ 或 SQL Azure DB,否则会出错。 More info about path literal

【讨论】:

  • 我已经给出了我实际的 json 格式。我如何使用 cte 并在那里交叉应用?
  • 您能否推荐一个适用于 SQL Server 2017 以下版本的解决方案?我收到The argument 2 of the "JSON_MODIFY" must be a string literal. 错误。
  • @Jishad,您可以生成更新语句。 select 'update [yourtable] set [jsoncol] = json_modify([jsoncol], ''$[' + [key] + '].name'', ''Joe'') where id = ' + [yourtable].id from [yourtable] cross apply openjson([jsoncol]) 之类的东西,然后用 sp_executesql 全部执行(当然要警惕 sql 注入)
  • 不敢相信我为这个答案付出了多大的努力,太爱了
【解决方案2】:

更新 JSON 数据 (Postgresql)

如果你的表中的列包含json数据,你想更新这个数据,可以使用如下结构:

UPDATE table_name SET column_name = '{"key" : value}'::jsonb 
WHERE column_name::jsonb @> '{“new_key” : new_value}'::jsonb;

注意:通常@> 用作“包含”运算符。

【讨论】:

    猜你喜欢
    • 2022-08-17
    • 2022-01-04
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 2022-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多