También he querido hacer esto, después de investigarlo y un poco de prueba y error, se me ocurrió esta solución funcional.
use el with
declaración
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;
Pruebe la actualización primero devolviendo la fila actualizada, si no se devuelve ninguna fila de la actualización, luego inserte la fila que devuelve la fila insertada. Luego seleccione una unión de los valores devueltos desde la actualización y la inserción, dado que solo ocurrirá uno, solo obtendrá una fila devuelta.
Espero que esto ayude