更新json数据psql中的值

yvfmudvl  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(301)

我有一个表,其中包含使用psql作为json存储在数据列中的表,试图更新(数据列)中的特定单元格,该单元格是对象数组。
例如,将“first\u name”:“fergus”更新为“first\u name”:“marcus”,其中“id”:“1”

CREATE TABLE tables(
    table_id SERIAL PRIMARY KEY,
    table_name VARCHAR(100) NOT NULL,
    user_id VARCHAR(100) NOT NULL,
    data json
);

INSERT INTO tables (table_name, user_id, data)
VALUES (
'Supplier Info', 4, '[
{"id":"1","first_name":"Fergus","last_name":"Flipsen","email":"fflipsen0@ezinearticles.com","gender":"Male"},
 {"id":"2","first_name":"Vincenz","last_name":"Russan","email":"vrussan1@independent.co.uk","gender":"Male"}
]'::JSON);
gojuced7

gojuced71#

这并不是那么容易(而且,正如一个没有名字的马所评论的那样,使用规范化的模式会简单得多)。
基本上,您需要取消内部数组的嵌套,修改相关对象,然后聚合回一个数组。
你可以用一个相关的子查询, jsonb_array_elements() 和条件逻辑 jsonb_agg() :

update tables t
set data = (
    select 
        jsonb_agg(
            case when (x.obj ->> 'id')::int = 1 
                then x.obj || '{"first_name": "Marcus"}'
                else x.obj
            end
            order by x.ord
        ) new_data
    from jsonb_array_elements(t.data) with ordinality x(obj, ord)
)

db小提琴演示

相关问题