sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql, uppdatera eller infoga baserat på fall

Jag har velat göra det här också, efter att ha tittat på det och lite försök och fel kom jag på den här fungerande lösningen.

använd with uttalande

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;

Försök med uppdateringen först och returnera raden uppdaterad, om det inte finns någon rad som returneras från uppdateringen, infoga sedan raden som returnerar den infogade raden. Välj sedan en förening av de returnerade värdena från uppdateringen och infogningen, eftersom bara en kommer att hända kommer du bara att få en rad returnerad.

Hoppas detta hjälper



  1. Vilken OJDBC-drivrutin för Java 6?

  2. Hur får jag en fråga att inte returnera något när det inte finns några villkor?

  3. Använd grupp efter insida underfråga

  4. Postgres tid med tidszonslikhet