"IF"或附近的Postgres语法错误

S. *_*. N 18 sql postgresql if-statement

我是postgres的新手,我正在完成我的任务.我不得不创建一个只有1列的表,然后我得到了这个声明在pgadmin III上运行:

BEGIN;
INSERT INTO mytable VALUES (1);
SAVEPOINT savepoint1;
INSERT INTO mytable VALUES (2);
ROLLBACK TO SAVEPOINT savepoint1;
INSERT INTO mytable VALUES (3);
SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (4);
INSERT INTO mytable VALUES (5);
SAVEPOINT savepoint3;
SELECT * FROM mytable;
--NOTE: You need to run this IF statement as PGScript 
--(button next to the normal run button)
IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4)
BEGIN
      RELEASE SAVEPOINT savepoint2;
END
ELSE
BEGIN
      INSERT INTO mytable VALUES(6);
END
--Run the next steps normally
SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (7);
RELEASE SAVEPOINT savepoint2;
INSERT INTO mytable VALUES (8);
ROLLBACK TO savepoint2;
COMMIT;
Run Code Online (Sandbox Code Playgroud)

当我运行这个时,我收到此错误:语法错误在"IF"或附近

我已经看过这个38.6.2.Conditionals38.6.2.条件,我不太了解这一点,我是否需要更改查询

IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4) THEN 
BEGiN 
Run Code Online (Sandbox Code Playgroud)

然后当它结束时我应该结束它:

END IF
Run Code Online (Sandbox Code Playgroud)

毕竟为什么会出错?

mu *_*ort 46

IF和其他PL/pgSQL功能仅在PL/pgSQL函数中可用.如果要使用,则需要将代码包装在函数中IF.如果你使用9.0+,那么你可以DO用来编写内联函数:

do $$
begin
  -- code goes here
end
$$
Run Code Online (Sandbox Code Playgroud)

如果您使用的是PostgreSQL的早期版本,则必须编写包含代码的命名函数,然后执行该函数.

  • 它在这个特定的例子中不起作用,但值得一提的是[`CASE`](http://www.postgresql.org/docs/9.4/static/functions-conditional.html)的行为类似于`IF`并且是在PL/pgSQL函数之外可用. - 在这些情况下需要考虑的事情. (4认同)

noz*_*zem 7

不是OP的答案,但可能是一些最终到达这里的人的答案(比如我自己):如果您在 BEGIN-END 块中声明变量,您将得到相同的语法错误。

所以这是错误的:

DO $$
BEGIN
  DECLARE my_var VARCHAR(50) := 'foo';
  IF my_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 
Run Code Online (Sandbox Code Playgroud)

这应该可以修复它:

DO $$
DECLARE my_var VARCHAR(50) := 'foo';
BEGIN
  IF my_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,它对我有帮助!但我怎样才能知道......你从哪里得到它?) (4认同)