私もこれをやりたいと思っていました。それを調べて少し試行錯誤した後、この実用的な解決策を思いつきました。
with
を使用する ステートメント
with
u as (
update my_table
set some_value = $2
where
id = $1
returning *
)
,
i as (
insert into my_table (id, some_value)
select $1, $2
where
not exists(select * from u)
returning *
)
select * from u
union
select * from i;
最初に更新された行を返す更新を試してください。更新から返された行がない場合は、挿入された行を返す行を挿入してください。次に、更新と挿入から返された値の和集合を選択します。1つしか発生しないため、返される行は1つだけです。
これがお役に立てば幸いです