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

Posted

技术标签:

【中文标题】PostgreSQL:仅当元素唯一时才将元素附加到 jsonb 数组【英文标题】:PostgreSQL: append elements to jsonb array only if element is unique 【发布时间】:2018-04-28 12:20:51 【问题描述】:

我创建了一个带有 jsonb-array 列的 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]

【问题讨论】:

【参考方案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)

【讨论】:

以上是关于PostgreSQL:仅当元素唯一时才将元素附加到 jsonb 数组的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB/Mongoose - 仅当某个字段是唯一的时才将对象添加到对象数组中

Swiftt3:如果不重复则附加到数组的扩展

仅当数组列表尚不存在时才将其添加到数组列表中

仅当记录不存在时才将 SQL 插入表中[重复]

仅当它们由相机拍摄而不是从照片库中选择时才将图像保存到照片库

R:仅当同一列中的两行中的值为真时才将值添加到 [row,column]