2017-11-15 14 views
0

다음과 같이 PostgreSQL (v10.0)을 만들었습니다. 다음과 같이PostgreSQL : 요소가 유일한 경우에만 jsonb 배열에 요소 추가

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; 

는 그러나, 나는 배열에 아직 몇 가지 요소가 있지만 이러한 요소를 추가합니다. 이 경우

, 즉에만 [닭 2]

답변

1

아마 간단한 일 것입니다 :

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)