sql >> Base de Datos >  >> RDS >> PostgreSQL

Postgresql, actualizar o insertar según el caso

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