我有一个数组对象,它不是更新的对象值。 它总是在数组中附加一个新对象。
我尝试过||运算符,但它仅适用于对象,而不适用于数组对象。 我执行以下操作:
UPDATE "chats" SET
"groupUserStatus"="groupUserStatus" :: JSONB || '{"1":"viewed"}'
WHERE "chats"."chatType"='groupchat' AND
("chats"."groupUserStatus") :: JSONB @> '{"1":"sent"}' :: JSONB
它已成功更新对象,但我有更新数组对象。 例如 像这样插入记录
[{"1":"sent"},{"2":"read"}]
但是我将如何获得这样的记录(如何更新记录)
[{"1":"viewed"},{"2":"read"}]
对不起,英语不好
答案 0 :(得分:0)
使用jsonb_set
set groupUserStatus = jsonb_set ( groupUserStatus :: JSONB ,'{0,"1"}', '"viewed"')
编辑:要动态获取索引并进行更新,您可能需要 提取数组的元素和每个键值对。
update t t1 set col = jsonb_set ( t2.col :: JSONB ,
('{'||j.idx-1||',"'||e.k||'"}')::text[] , '"viewed"' )
FROM t t2 cross join
jsonb_array_elements (t2.col :: JSONB) with ordinality as j(elem,idx)
cross join jsonb_each_text(j.elem) as e(k,v)
where e.v ='sent'
and t1.id = t2.id