PostgreSQL:仅当元素唯一时才将元素附加到jsonb数组

PostgreSQL:仅当元素唯一时才将元素附加到jsonb数组,sql,json,postgresql,jsonb,Sql,Json,Postgresql,Jsonb,我创建了一个PostgreSQL v10.0,如下所示 CREATE TABLE test (id INT, animals jsonb) INSERT INTO test VALUES (1, '["[monkeys, 10]", "[hamsters, 7]", "[foxes, 3]"]'), (2, '["[monkeys, 10]", "[hamsters, 7]", "[foxes, 3]"]') 然后我添加新的动物,如下所示: UPDATE test SET ani

我创建了一个PostgreSQL v10.0,如下所示

CREATE TABLE test (id INT, animals jsonb)

INSERT INTO test VALUES
   (1, '["[monkeys, 10]", "[hamsters, 7]", "[foxes, 3]"]'),
   (2, '["[monkeys, 10]", "[hamsters, 7]", "[foxes, 3]"]')
然后我添加新的动物,如下所示:

UPDATE test
SET animals = animals || '["[hamsters, 7]", "[chicken, 2]"]'::jsonb
WHERE id = 1;
但是,我想附加几个元素,但只附加那些尚未在数组中的元素


在这种情况下,只有[chicken,2]

最简单的可能是:

t=# with c as (select distinct e,min(o) over (partition by e) o from test, jsonb_array_elements(animals || '["[hamsters, 7]", "[chicken, 2]"]'::jsonb) with ordinality t(e,o) where id =1)
, r as (select jsonb_agg(e order by o) z from c)
t-# update test set animals = z from r where id = 1;
UPDATE 1
t=# select * from test;
 id |                             animals
----+------------------------------------------------------------------
  2 | ["[monkeys, 10]", "[hamsters, 7]", "[foxes, 3]"]
  1 | ["[monkeys, 10]", "[hamsters, 7]", "[foxes, 3]", "[chicken, 2]"]
(2 rows)