【问题标题】:Postgres: update specific json object in arrayPostgres:更新数组中的特定json对象
【发布时间】:2019-04-01 15:13:31
【问题描述】:

在使用 POSTGRES 查询时遇到一些问题。

我有一个名为venue_menu 的列jsonb,它有一个对象数组,如下所示:

[
    { "menu_id":"0", "menu_name":"name 1"},
    { "menu_id":"1", "menu_name":"name 2"},
    { "menu_id":"2", "menu_name":"name 3"}
]

我想进行更新,例如在 menu_id 为 2 的对象上,该对象由 client_id 列(WHERE 子句)选择的特定行。到目前为止,我有以下查询

UPDATE client SET venue_menu = jsonb_set(venue_menu, '{}', { "menu_id":"2", "menu_name":"name updated"}) WHERE client_id = "1";

我似乎不知道在哪里进行指定要更新的对象的键名的查询,有什么想法吗?

谢谢。

【问题讨论】:

标签: postgresql


【解决方案1】:

使用jsonb_set

update "t" set "col"= jsonb_set("cols":: JSONB,('{'|| elem_index || ',"' ||'menu_name"}')::text[],'"name updated"'::jsonb,false)
from (select pos- 1 as elem_index,"col" as "cols","client_id" as "colId"
from  "t",jsonb_array_elements("t"."col" :: JSONB) with ordinality arr(elem, pos) where elem->>'menu_id' = '2') as "tble"     
where  client_id =1

DEMO

【讨论】:

  • 关于代码 sn-p 的简短描述将大大改善答案。请考虑添加有关代码是什么以及它的作用的描述。
【解决方案2】:

你可以使用:

  1. jsonb_to_recordset 将数组拆分为行
  2. jsonb_build_object 使用拆分行构建每个元素
  3. jsonb_agg 将每个元素加入到一个新数组中

示例如下:

select jsonb_agg(jsonb_build_object(
    'menu_id', menu_id, 
    'menu_name', case when menu_id='2' then 'name changed' else menu_name end
  ))
  from jsonb_to_recordset('[
    { "menu_id":"0", "menu_name":"name 1"},
    { "menu_id":"1", "menu_name":"name 2"},
    { "menu_id":"2", "menu_name":"name 3"}
]') as menu_t(menu_id text, menu_name text);

您可以在以下位置查看运行示例:https://dbfiddle.uk/?rdbms=postgres_10&fiddle=147c0de2abd5d0df786ed636793f1cc8

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2021-10-06
    • 2021-04-26
    • 2017-04-27
    • 2020-07-21
    • 1970-01-01
    相关资源
    最近更新 更多