如何使用 json 子元素更新 postgresql

How to update postgresql using json sub-element

如何将 ID 等于 1003 的 10.2 命名值更新到 postgresql 数据库 table。

Json数据Table

Id Column
1001 {"results":[{"name":"A","value":"7.8"}, {"name":"B","value":"0.5"}]}
1002 {"results":[{"name":"B","value":"5.4"}, {"name":"D","value":"4.5"}]}
1003 {"results":[{"name":"D","value":"4.8"}, {"name":"A","value":"6.7"}]}

更新后的结果

Id Column
1001 {"results":[{"name":"A","value":"7.8"}, {"name":"B","value":"0.5"}]}
1002 {"results":[{"name":"B","value":"5.4"}, {"name":"D","value":"4.5"}]}
1003 {"results":[{"name":"D","value":"4.8"}, {"name":"A","value":"10.2"}]}

这不是一个简单的查询,只能使用 CTE 来完成。我将您的示例 table 称为 test:

with item_in_list_pos as (
    select
        pos - 1 as pos
        from test, jsonb_array_elements(column1->'results') with ordinality a(elem, pos)
        where (
            id = 1003
            and elem->>'name' = 'A'
        )
)
update test
    set 
        column1 = jsonb_set(column1, array['results', pos, 'value']::text[], to_jsonb('10.2'::text))
    from item_in_list_pos
    where (
        id = 1003
    )