PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Postgresql, aggiorna o inserisci in base al caso

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