I have a table with following definition:
create table json_test (
filter_data jsonb);
and i insert to it values like this:
'{"task_packets": [
{
"state": "PROCEEDING",
"task_id": 1001
},
{
"state": "REVERTING",
"task_id": 1002
}
]}'
Now I want to update this jsonb
column to:
'{"task_packets": [
{
"state": "DONE",
"task_id": 1001
},
{
"state": "REVERTING",
"task_id": 1002
}
]}'
i.e. I want to change state for value with specified task_id
inside array of task_packets. I suggest somehow to use jsonb_set()
function in combination with #-
operator (first delete value from array, then append to it with updated state).
How can I do it?
Best Answer
Like I commented, this would be more efficient with a normalized DB layout, with a table like this
Among other things, we can have a PK constraint enforcing unique
task_id
numbers. And theUPDATE
you want is trivial.But to answer the question asked:
To
SELECT
:I suggest a
LATERAL
join, among other things to exclude the possibility of multiple matching rows that might be lumped together incorrectly in a plain join.To
UPDATE
:The same can be implemented with a correlated subquery in the
UPDATE
(or in theSELECT
as well).To make this fast for big tables, be sure to have an appropriate index, ideally a
jsonb_path_ops
index: