PostgreSQL,基于大小写的UPDATE或INSERT [英] Postgresql, update or insert based by case

查看:20
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆