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