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

PostgreSQL中带有if-else语句的存储过程,sql,postgresql,sql-insert,plpgsql,sql-delete,Sql,Postgresql,Sql Insert,Plpgsql,Sql Delete,我正试图找到在我的应用程序上创建“喜欢”按钮的最佳方法。我希望使用相同的端点,并使用一个存储过程来处理逻辑。到目前为止,这就是我所拥有的,但它似乎不起作用。我的目标是测试记录是否存在,如果存在,则删除该记录,否则创建该记录。请让我知道我做错了什么,或者是否需要存储过程。下面是我希望在过程中使用的逻辑,但目前不起作用。谢谢 IF (SELECT * FROM favorite_movies WHERE movie_id = '577922' and user_id = '5' limit 1)th

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

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支持在公共表表达式中返回
,这使得在单个查询中实现逻辑成为可能:

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


我敢打赌你没有用“;”结束一个表达式就在
IF
语句之前。您需要先显示代码,然后才能进行上述确认。另外,
SELECT
语句也不起作用。表达式需要解析为布尔值。如果要使用该查询,请执行:
PERFORM*FROM favorite_movies,其中movie_id='577922'和user_id='5'限制1
IF
上方的一行,然后是
如果找到则[…]
。有关更多信息,请参阅