我在postgres中有一个表,其中包含jsonb类型的列,我曾经以这种格式保存在jsons的此字段数组中。
post_id |questions |
------------------------------------|---------------------------------------
70071d97-06a8-401f-abfc-20ddada4f402|[{"question": "TEST QUESTION", "transaction_id": "ac547b52-72f3-444e-800c-46aaa48855a5"}, {"question": "TEST QUESTION", "transaction_id": "ac547b52-72f3-444e-800c-46aaa48855ab"}]|
我想基于transaction_id删除该列表中的项目。
post_id |questions |
------------------------------------|---------------------------------------
70071d97-06a8-401f-abfc-20ddada4f402|[{"question": "TEST QUESTION", "transaction_id": "ac547b52-72f3-444e-800c-46aaa48855a5"}]|
我尝试了几种方法,但都没有成功,我尝试过
select questions - '{"question": "TEST QUESTION", "transaction_id": "ac547b52-72f3-444e-800c-46aaa48855a5"}' from posts where post_id = '70071d97-06a8-401f-abfc-20ddada4f402';
答案 0 :(得分:2)
UPDATE posts p
SET questions = data
FROM (
SELECT
questions,
jsonb_agg(elems.value) AS data -- 3
FROM
posts,
jsonb_array_elements(questions) elems -- 1
WHERE -- 2
not (elems.value ->> 'transaction_id' = 'ac547b52-72f3-444e-800c-46aaa48855a5')
GROUP BY questions
) s
WHERE s.questions = p.questions;
答案 1 :(得分:0)
感谢S-Man的回应。我能够实现我真正想要的。
update edz_posts set questions =
(SELECT
'[]'::jsonb || jsonb_agg(elems.value)
FROM
edz_posts,
jsonb_array_elements(questions) elems
where post_id = :post_id and universe_id=:universe_id
and not (elems.value ->> 'transaction_id' = :transaction_id)
group by questions)
where post_id = :post_id and universe_id=:universe_id
;
update edz_posts set questions = '[]'::jsonb where questions is null ;