Jag har velat göra det här också, efter att ha tittat på det och lite försök och fel kom jag på den här fungerande lösningen.
använd with
uttalande
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;
Försök med uppdateringen först och returnera raden uppdaterad, om det inte finns någon rad som returneras från uppdateringen, infoga sedan raden som returnerar den infogade raden. Välj sedan en förening av de returnerade värdena från uppdateringen och infogningen, eftersom bara en kommer att hända kommer du bara att få en rad returnerad.
Hoppas detta hjälper