2016-08-11 4 views
0

В PostgreSQL У меня есть таблица, в которой определено, как это:Как изменить массив jsonb в postgresql?

create table carts(
    id serial, 
    cart json 
) 

имеет такие данные:

id  cart 
3  [{"productid":5,"cnt":6},{"productid":8,"cnt":1}] 
5  [{"productid":2},{"productid":7,"cnt":1},{"productid":34,"cnt":3}] 

, если я хочу изменить данные «ЦНТ», с идентификатором = п и ProductID = m, как я могу это сделать? например, когда id = 3 и productid = 8, я хочу изменить cnt на cnt + 3, , как это реализовать?

+1

Возможно [это] (http://stackoverflow.com/questions/26703476/how-to-perform-update-operations-on-columns-of-type-jsonb-in-postgres-9-4) помогу. –

+0

отличный вопрос, никто не отвечает? – user6161156

+0

Я думаю, что Postgres имеет ограниченную возможность обновлять JSON на месте. Вместо этого вам, возможно, придется извлечь JSON, изменить его, а затем обновить все значение. –

ответ

0

Попробуйте это, здесь мы будем использовать jsonb_set метод

jsonb_set(target jsonb, path text[], new_value jsonb) который будет возвращать jsonb объекта

update carts 
     set cart = (
    (select json_agg(val)from 
    (SELECT 
    CASE 
    WHEN value->>'productid'='8' THEN jsonb_set(value::jsonb, '{cnt}', (((value->>'cnt')::int)+3)::text::jsonb)::json --again convert to json object 
    ELSE value END val 
     FROM carts,json_array_elements(cart) where id=3)) 
where id=3; 

Надеется, что это работает для вас

EDIT: вы можете обобщены это путем создания с id и productid как входной параметр.

+0

Вы можете сослаться на [Json in PostgrSql] (https://www.postgresql.org/docs/9.5/static/functions-json.html) для получения дополнительной информации – Paarth

Смежные вопросы