【问题标题】:How to update JSON node that matches criteria based on attribute value (instead of index)?如何根据属性值(而不是索引)更新匹配条件的 JSON 节点?
【发布时间】:2019-01-28 19:13:14
【问题描述】:

Postgresql 10+

文档中的示例...

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false)

结果...

[{"f1":[2,3,4],"f2":null},2,null,3]

很公平。但是我需要通过属性值而不是索引来找到我的目标节点。对于我的生活,我无法弄清楚如何做......

jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{(where f1 = 1),f1}','[2,3,4]', false)

关于如何做到这一点的任何建议? 谢谢!

【问题讨论】:

标签: postgresql postgresql-json


【解决方案1】:

您可以将这些步骤分成两个工作:

  1. 在元素中拆分 (jsonb_arral_elements)
  2. 确定哪些元素必须更改(大小写...)
  3. 更新该元素 (jsonb_set)
  4. 一起加入 (jsonb_agg)

解决方案

select jsonb_agg(case when element->>'f1'='1' then jsonb_set(element, '{f1}', '[2,3,4]') else element end)
  from jsonb_array_elements('[{"f1":1,"f2":null},2,null,3,{"f1":3},{"f1":1,"f2":2}]'::jsonb) element

注意

我用“f1”键更改了输入,又添加了两个元素

【讨论】:

  • 感谢您的回复。这确实改变了 json,但是,我没有看到它提供了更新记录的方法。也许是我的错,没有明确说明这是我需要的。如果我错了,请纠正我,但在我看来,我必须获取项目索引以便在保留整个节点的同时更改项目。 @klin 发布的链接有效。有点冗长和令人费解,但到目前为止,唯一对我有用的东西。
  • @JimOtt,您可以在更新语句中使用它。请参阅:rextester.com/BLC52070
猜你喜欢
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2010-09-08
  • 2013-10-10
  • 1970-01-01
  • 2019-06-19
  • 1970-01-01
  • 2021-02-18
相关资源
最近更新 更多