postgresql Postgres sql查询更新二级键json集

4bbkushb  于 2023-01-30  发布在  PostgreSQL
关注(0)|答案(1)|浏览(172)

我将postgres行设置为jsonb,将值设置为foll{“value”:{“苹果”:假,“球”:对,“猫”:错误的{}流程

{
    "value": {
        "a": false,
        "b": true,
        "c": false
    }
}

我想要第二级键(a、B、c)类似于

{
    "value": {
        "apple": false,
        "ball": true,
        "cat": false
    }
}

如何使用postgresql来实现这一点
我无法找到更新第二级密钥的示例
期望更新的响应,如{“value”:{“苹果”:假,“球”:对,“猫”:错误} }

ruarlubt

ruarlubt1#

您可以使用cte将新的键名与旧的键名相关联,然后使用jsonb_object_agg进行更新和聚合:

with cte(o_id, n_id) as (
   select 'a', 'apple'
   union all
   select 'b', 'ball'
   union all
   select 'c', 'cat'
)
update tbl set js = jsonb_build_object('value', (select jsonb_object_agg(c.n_id, v.value) 
  from jsonb_each(js -> 'value') v join cte c on c.o_id = v.key) || coalesce(
     (select jsonb_object_agg(v.key, v.value) from jsonb_each(js -> 'value') v 
      where not exists (select 1 from cte c where c.o_id = v.key)), '{}'::jsonb));

See fiddle.

相关问题