Postgresql Postgres:在数组中更新特定的json对象
在POSTGRES查询中遇到一些问题 我有一个名为venue_menu的jsonb列,它有一个如下所示的对象数组:Postgresql Postgres:在数组中更新特定的json对象,postgresql,Postgresql,在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"} ] 我想进行更新,例如,在对象上,对于列client_id(where子句)选择的特定行,menu_id为2。到目前
[
{ "menu_id":"0", "menu_name":"name 1"},
{ "menu_id":"1", "menu_name":"name 2"},
{ "menu_id":"2", "menu_name":"name 3"}
]
我想进行更新,例如,在对象上,对于列client_id(where子句)选择的特定行,menu_id为2。到目前为止,我有以下疑问
UPDATE client SET venue_menu = jsonb_set(venue_menu, '{}', { "menu_id":"2", "menu_name":"name updated"}) WHERE client_id = "1";
我似乎不知道在哪里执行指定要更新的对象的键名的查询,有什么想法吗
谢谢。您可以使用:
jsonb_to_记录集
将数组拆分为行jsonb\u build\u对象
使用拆分的行构建每个元素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);
您可以在以下位置看到一个运行示例:使用
jsonb\u集
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
请参阅关于代码片段的简短描述的可能重复,这将大大改进答案。请考虑添加一个关于代码是什么和它做什么的描述。