Let's say I have a table students
with a column type jsonb
where I store a list with students' additional emails. A student row looks like this
student_id | name | emails |
---|---|---|
1 | John Doe | [[email protected]] |
I'm using the following query to update the emails
column:
UPDATE students SET emails = emails || '["[email protected]"]'::jsonb
WHERE student_id=1
AND NOT emails @> '["[email protected]"]'::jsonb;
Once the column emails
is filled, if I reuse query above with the parameter ["[email protected]", "[email protected]"]
, the column emails
would be update with repeated value:
student_id | name | emails |
---|---|---|
1 | Student 1 | [[email protected], [email protected], [email protected]] |
Is there a way to make sure that in the column emails
I'll always have a jsonb list with only unique values ?
CodePudding user response:
Use this handy function which removes duplicates from a jsonb array:
create or replace function jsonb_unique_array(jsonb)
returns jsonb language sql immutable as $$
select jsonb_agg(distinct value)
from jsonb_array_elements($1)
$$;
Your update statement may look like this:
update students
set emails = jsonb_unique_array(emails || '["[email protected]", "[email protected]"]'::jsonb)
where student_id=1
and not emails @> '["[email protected]", "[email protected]"]'::jsonb
Test it in db<>fiddle.