PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Postgresql, atualização ou inserção baseada em caso


Eu também queria fazer isso, depois de analisar e um pouco de tentativa e erro, cheguei a esta solução de trabalho.

use o with declaração
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;

Tente a atualização primeiro retornando a linha atualizada, se não houver nenhuma linha retornada da atualização, insira a linha que retorna a linha inserida. Em seguida, selecione uma união dos valores retornados da atualização e da inserção, pois apenas um acontecerá, você receberá apenas uma linha retornada.

Espero que isto ajude