PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Postgresql, cập nhật hoặc chèn dựa trên từng trường hợp

Tôi cũng muốn làm điều này, sau khi xem xét nó và một chút thử và sai, tôi đã đưa ra giải pháp hiệu quả này.

sử dụng with tuyên bố

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;

Thử cập nhật trước tiên trả về hàng được cập nhật, nếu không có hàng nào được trả về từ bản cập nhật, thì hãy chèn hàng trả về hàng đã chèn. Sau đó, chọn một liên hợp các giá trị trả về tạo thành bản cập nhật và phần chèn, vì chỉ một trường hợp xảy ra, bạn sẽ chỉ nhận được một hàng được trả về.

Hy vọng điều này sẽ giúp



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để trả về '0' từ truy vấn trong pgsql, nếu hàng không tồn tại?

  2. Khóa và thực hiện đồng thời một thủ tục được lưu trữ

  3. Thêm khóa vào cột hstore trống

  4. Rails bao gồm truy vấn với các điều kiện không trả lại tất cả kết quả từ bảng bên trái

  5. Trả về nhiều giá trị trong một hàm