Postgres/JSON - update all array elements

后端 未结 2 1453
佛祖请我去吃肉
佛祖请我去吃肉 2021-01-20 15:25

Given the following json:

{
  \"foo\": [
    {
      \"bar\": true
    },
    {
      \"bar\": true
    }
  ]
}

How can I select the follow

2条回答
  •  后悔当初
    2021-01-20 16:06

    There is no standard function to update json array elements by key. A custom function is probably the simplest way to solve the problem:

    create or replace function update_array_elements(arr jsonb, key text, value jsonb)
    returns jsonb language sql as $$
        select jsonb_agg(jsonb_build_object(k, case when k <> key then v else value end))
        from jsonb_array_elements(arr) e(e), 
        lateral jsonb_each(e) p(k, v)
    $$;
    
    select update_array_elements('[{"bar":true},{"bar":true}]'::jsonb, 'bar', 'false');
    
          update_array_elements
    ----------------------------------
     [{"bar": false}, {"bar": false}]
    (1 row)
    

    Your query may look like this:

    with a_data(js) as (
    values(
        '{
            "foo": [
              {
                "bar": true
              },
              {
                "bar": true
              }
            ]
        }'::jsonb)
    )
    select
        jsonb_set(js, '{foo}', update_array_elements(js->'foo', 'bar', 'false'))
        from a_data;
    
                     jsonb_set                 
    -------------------------------------------
     {"foo": [{"bar": false}, {"bar": false}]}
    (1 row)     
    

提交回复
热议问题