У меня есть запрос UPSERT, в котором я хочу вставить значение y в столбец b, но если он уже существует, я хочу обновить его значением z. INSERT INTO test (a, b) выберите P.x, P.y из (VALUES ('123', 4, 5) ...

0
Heisenberg 14 Янв 2021 в 09:58

1 ответ

Лучший ответ

В части SET вы можете ссылаться только на столбцы целевой таблицы и соответствующие «значения» через запись excluded. Ни у одного из них нет столбца с именем 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 является первичным (или уникальным) ключом таблицы.

Пример онлайн

3
a_horse_with_no_name 14 Янв 2021 в 07:35