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

时间:2020-09-03 23:11:55

标签: sql postgresql sql-insert plpgsql sql-delete

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

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

1 个答案:

答案 0 :(得分:0)

不需要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

相关问题