Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql Postgres:在数组中更新特定的json对象_Postgresql - Fatal编程技术网

Postgresql Postgres:在数组中更新特定的json对象

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。到目前

在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。到目前为止,我有以下疑问

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
    

    请参阅关于代码片段的简短描述的可能重复,这将大大改进答案。请考虑添加一个关于代码是什么和它做什么的描述。