微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL中带有if else语句的存储过程

如何解决PostgreSQL中带有if else语句的存储过程

我正在尝试找到在应用程序上创建“赞”按钮的最佳方法。我想打相同的端点,并有一个存储过程照顾逻辑。到目前为止,这是我所拥有的,但似乎不起作用。我的目标是测试记录是否存在,如果确实存在,则删除记录,否则创建记录。请让我知道我在做什么错,或者如果存储过程是解决问题的方法。以下是该过程中我想要的逻辑,但目前无法正常工作。谢谢

IF (SELECT * FROM favorite_movies WHERE movie_id = '577922' and user_id = '5' limit 1)then
 delete from favorite_movies WHERE movie_id = 577922 and user_id = 5;
  else 
  INSERT INTO favorite_movies (user_id,movie_id)VALUES (5,577922);
END IF

我得到的错误

sql Error [42601]: ERROR: Syntax error at or near "IF"
  Position: 1

解决方法

不需要plpgsql。 Postgres在common-table-expressions中支持returning,这使得在单个查询中实现逻辑成为可能:

with 
    param (movie_id,user_id) as (select 577922,5),-- query parameters
    del as (                                            -- try to delete
        delete from favorite_movies m
        using param p
        where m.movie_id = p.movie_id and m.user_id = p.user_id
        returning 1
    )
insert into favorite_movies (movie_id,user_id)         -- if nothing was deleted,then insert 
select p.* 
from param p
where not exists (select 1 from del)

基本上,这实现了“切换”功能。第一次执行查询时,没有要删除的内容,因此会插入新行;下次,它将删除该行,因此不会插入,依此类推。

Demo on DB Fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。