mycolumn是jsonb类型,默认值为空数组。
如果新值不存在,我想更新此数组。
选择查询:

SELECT mycolumn FROM mytable WHERE id = 1;

返回:[]
更新查询:
UPDATE mytable SET mycolumn = mycolumn || '[{"foo":"bar"}]' WHERE id = 1;

选择返回:[{"foo":"bar"}]
如果更新查询运行多次,它会将值追加到数组中。
再次运行update,选择returns[{"foo":"bar"},{"foo":"bar"}]等。
是否有更新mycolumn数组值的等幂方法?

最佳答案

如果“部分”安全壳不在工作台上,那么安全壳操作员(<@@>)对您没有好处。您需要检查每个元素是否相等:

with append(a) as (
  values (jsonb '{"foo":"bar"}')
)
update mytable
set    mycolumn = mycolumn || a
from   append
where  id = 1
and    not exists(
  select 1
  from   jsonb_array_elements(mycolumn) e
  where  e = a
)

注意:如果愿意重复要“插入”的JSON对象,则可以避免使用CTE(WITH子句)。
http://rextester.com/IAHE54266

关于arrays - 如果对象不存在,则将对象连接到数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43379660/

10-13 04:42