PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Postgresql, mise à jour ou insertion en fonction du cas

Je voulais le faire aussi, après l'avoir examiné et un peu d'essais et d'erreurs, j'ai trouvé cette solution de travail.

utiliser le with déclaration

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;

Essayez d'abord la mise à jour en renvoyant la ligne mise à jour, s'il n'y a pas de ligne renvoyée par la mise à jour, puis insérez la ligne en renvoyant la ligne insérée. Sélectionnez ensuite une union des valeurs renvoyées de la mise à jour et de l'insertion, puisqu'une seule se produira, vous n'obtiendrez qu'une seule ligne renvoyée.

J'espère que cela vous aidera