Postgres:关于冲突,求和两个向量(数组)

Postgres: on conflict, summing two vectrors(arrays)

我正在尝试处理 Postgres 中的计数器列数组 例如,假设我有这个 table

name counters
Joe [1,3,1,0]

现在我要添加 2 个值 ("Ben", [1,3,1,0]) 和 ("Joe",[2,0,2,1])

我希望查询在冲突时对 2 个计数器向量求和 ([1,3,1,0] + [2,0,2,1] = [3,3,3,1])

预期结果:

name counters
Joe [3,3,3,1]
Ben [1,3,1,0]

我试过这个查询

insert into test (name, counters) 
values ("Joe",[2,0,2,1]) 
on conflict (name) 
do update set 
    counters = array_agg(unnest(test.counters) + unnest([2,0,2,1]))

但它似乎没有用,我错过了什么?

根据您对我的评论的回复,即它始终是数组中的四个元素并且更新是由某种类型的程序完成的,我建议如下:

insert into test (name, counters)
values (:NAME, :COUNTERS)
on conflict (name) do
update set
  counters[1] = counters[1] + :COUNTERS[1],
  counters[2] = counters[2] + :COUNTERS[2],
  counters[3] = counters[3] + :COUNTERS[3],
  counters[4] = counters[4] + :COUNTERS[4]

表达式有两个问题:

array_agg(unnest(test.counters) + unnest([2,0,2,1]))
  • 数组没有 + 运算符,
  • 您不能使用 set-valued 表达式作为聚合函数中的参数。

您需要在 from 子句中的单个 unnest() 调用中取消嵌套两个数组:

insert into test (name, counters) 
values ('Joe', array[2,0,2,1]) 
on conflict (name) do 
update set 
counters = (
    select array_agg(e1 + e2)
    from unnest(test.counters, excluded.counters) as u(e1, e2)
    )

还要注意values中正确的数据语法和特殊记录的使用excluded(查找相关资料in the documentation.

db<>fiddle.

中测试