在 ON CONFLICT UPDATE 的 INSERT 值列表中使用额外的列

Use extra columns in INSERT values list in ON CONFLICT UPDATE

我有一个 UPSERT 查询,我想在列 b 中插入值 y 值,但如果它已经存在,我想用值 z.[= 更新它14=]

INSERT INTO test (a,b)
select P.x,P.y
from (VALUES 
    ('123', 4, 5),
    ('345', 2, 2)  
) K(x,y,z)
ON CONFLICT (a) DO UPDATE
SET b = K.z;

我怎样才能做到这一点?

P.S:一个简单的值列表(没有 select)不起作用,因为值列表中的列数不能超过我们插入的列数。

SET部分,只能通过excluded记录引用目标table的列和对应的“值”。他们都没有名为 z

的列

我能想到的唯一方法是将值放入 CTE 并通过子查询访问列 z

with data (x,y,z) as (
  VALUES 
      (123, 4, 6),
      (345, 2, 3)  
)
INSERT INTO test (a,b)
select d1.x, d1.y
from data d1
ON CONFLICT (a) DO UPDATE
  SET b = (select d2.z from data d2 where d2.x = excluded.a);

以上假定 a 是 table 的主(或唯一)键。

Online example