Volevo farlo anch'io, dopo averlo esaminato e un po' di tentativi ed errori ho trovato questa soluzione funzionante.
usa il with
dichiarazione
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;
Provare l'aggiornamento restituendo prima la riga aggiornata, se non ci sono righe restituite dall'aggiornamento, quindi inserire la riga che restituisce la riga inserita. Quindi seleziona un'unione dei valori restituiti dall'aggiornamento e dall'inserimento, poiché ne accadrà solo uno otterrai solo una riga restituita.
Spero che questo aiuti