【问题标题】:Postgres syntax error at or near "IF"“IF”处或附近的 Postgres 语法错误
【发布时间】:2014-01-24 06:56:37
【问题描述】:

我是 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;

当我运行它时,我得到了这个错误:“IF”或附近的语法错误

这个38.6.2. Conditionals38.6.2. Conditionals已经看过了,这个我不是很懂,要不要改查询才能有

IF (CAST ((SELECT MAX(id) FROM mytable) AS INTEGER) = 4) THEN 
BEGiN 

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

END IF

为什么会出现错误??

【问题讨论】:

  • 你错过了THEN...这是IF ... THEN ... ELSE ...。你有IF ... ... ELSE
  • @MarcB 我用 THEN 尝试过,但仍然出现错误

标签: sql postgresql if-statement


【解决方案1】:

IF 和其他 PL/pgSQL 功能仅在 PL/pgSQL 函数中可用。如果你想使用IF,你需要将你的代码包装在一个函数中。如果您使用的是 9.0+,那么您可以使用 DO 编写内联函数:

do $$
begin
  -- code goes here
end
$$

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

【讨论】:

  • 它在这个特定的实例中不起作用,但值得一提的是CASE 的行为类似于IF 并且在PL/pgSQL 函数之外可用。 - 只是在这些情况下需要考虑的事情。
【解决方案2】:

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

所以这是错误的:

DO $$
BEGIN
  DECLARE my_var VARCHAR(50) := 'foo';
  IF some_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 

这应该可以解决它:

DO $$
DECLARE my_var VARCHAR(50) := 'foo';
BEGIN
  IF some_var IS NULL THEN
     --some logic
  END IF;
END; 
$$ 

【讨论】:

  • 谢谢,它帮助了我!但是我怎么才能知道...你从哪里得到的?)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-10
  • 2021-12-04
  • 2021-10-26
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
相关资源
最近更新 更多