PostgreSQL,基于大小写的UPDATE或INSERT [英] Postgresql, update or insert based by case
本文介绍了PostgreSQL,基于大小写的UPDATE或INSERT的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
UPDATE和INSERT语句在我单独运行且没有事务的情况下工作.
但是我喜欢在事务中按照给定的顺序执行这两种操作,并且每次都会获得返回值-无论是插入还是更新-我该如何做`?
BEGIN;
UPDATE globaldata SET valuetext=(SELECT (CAST(coalesce(valuetext, '0') AS integer) + 1) FROM globaldata WHERE keyname='bb') WHERE keyname='bb' RETURNING valuetext;
INSERT INTO globaldata (keyname, valuetext)SELECT 'bb', '1' WHERE NOT EXISTS (SELECT 1 FROM globaldata WHERE keyname='bb') RETURNING valuetext;
COMMIT;
我尝试按Case When Then包装UPDATE和INSERT语句.但没有成功.
我喜欢这样做:
BEGIN;
CASE
WHEN (select count(id) from globaldata where keyname='bb') > 0 THEN
UPDATE globaldata SET valuetext=(SELECT (CAST(coalesce(valuetext, '0') AS integer) + 1) FROM globaldata WHERE keyname='bb') WHERE keyname='bb' RETURNING valuetext;
ELSE
INSERT INTO globaldata (keyname, valuetext)SELECT 'bb', '1' WHERE NOT EXISTS (SELECT 1 FROM globaldata WHERE keyname='bb') RETURNING valuetext;
END;
COMMIT;
推荐答案
我也一直想这样做,经过研究和一些试错之后,我想出了这个可行的解决方案。
使用with
语句
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;
首先尝试UPDATE返回更新的行,如果更新没有返回行,则插入返回插入行的行。然后从UPDATE和INSERT中选择返回值的联合,因为只会发生一种情况,您将只返回一行。
希望这对您有帮助
这篇关于PostgreSQL,基于大小写的UPDATE或INSERT的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文