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.)
中测试
我正在尝试处理 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.)