【问题标题】:PostgreSQL : Update multiple inner jsonb objects fields with same namePostgreSQL:更新多个具有相同名称的内部 jsonb 对象字段
【发布时间】:2019-09-15 15:00:59
【问题描述】:

我有一个名为 test 的表,它有 2 列:(id int, md jsonb)md 列可以包含这样的数据

{
  "a": {
    ...
    "author": "alice"
    ...
  },
  "b": {
    ...
    "author": "alice"
    ...
  }
}

现在我想将alice 的所有实例更新为bob

我通过这样做得到了包含alice 的行的ID

select id from test, lateral jsonb_each(md) where md->>'author' = 'alice';

是否有任何 Postgres 工具可以更新每个包含 author 字段的内部对象?

欢迎提出任何建议。

【问题讨论】:

  • jsonb_set()? - 但是使用正确规范化的数据模型会容易得多
  • 如何使用它来遍历 jsonb 的每个内部对象并更新值?

标签: postgresql sql-update crud jsonb


【解决方案1】:

我同意@a_horse_with_no_name 的观点,即最好检查您的存储空间。但是作为一个练习来做是很有趣的。我认为唯一的方法是用jsonb_each扩展json,用jsonb_set更新数据,然后用jsonb_object_agg聚合回来:

update test as t set
    md = (
    select
        jsonb_object_agg(
            d.key,
            case
                when d.value->>'author' = 'alice' then
                    jsonb_set(d.value, '{author}', '"bob"')
                else
                    d.value
            end
        )
     from lateral jsonb_each(t.md) as d
    )
where
    exists (select * from jsonb_each(t.md) as d where d.value->>'author' = 'alice')

db<>fiddle demo

【讨论】:

    猜你喜欢
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 2021-02-02
    • 1970-01-01
    相关资源
    最近更新 更多