【问题标题】:Stored Procedure with if else statement in PostgreSQLPostgreSQL 中带有 if else 语句的存储过程
【发布时间】:2020-09-03 23:11:55
【问题描述】:

我正在努力寻找在我的应用程序上制作“喜欢”按钮的最佳方式。我想打同一个端点并让一个存储过程来处理逻辑。这是我到目前为止所拥有的,但它似乎不起作用。我的目标是测试记录是否存在,如果存在则删除记录,否则创建记录。请让我知道我做错了什么,或者存储过程是否是这里的方法。以下是我在该过程中想要的逻辑,但目前无法正常工作。谢谢

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

【问题讨论】:

  • 我敢打赌你没有用';'终止表达式就在IF 声明之前。您需要在上述之前显示代码以确认。 SELECT 语句也不起作用。表达式需要解析为布尔值。
  • 如果您想使用该查询,请执行以下操作:PERFORM * FROM favorite_movies WHERE movie_id = '577922' and user_id = '5' limit 1; IF 上方的一行,然后是 IF FOUND THEN [...]。欲了解更多信息,请参阅here

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2015-01-17
    • 1970-01-01
    • 2013-04-07
    • 2019-09-07
    • 2013-11-18
    • 2015-04-22
    • 2011-10-08
    • 1970-01-01
    • 2019-02-27
    相关资源
    最近更新 更多