PostgreSQL IF语句


Answers:


139
DO
$do$
BEGIN
   IF EXISTS (SELECT FROM orders) THEN
      DELETE FROM orders;
   ELSE
      INSERT INTO orders VALUES (1,2,3);
   END IF;
END
$do$

标准SQL中没有过程元素。该IF语句是默认过程语言PL / pgSQL的一部分。您需要使用该DO命令创建函数或执行即席语句。

;在plpgsql中的每个语句的末尾都需要用分号()(最后一个除外END)。

您需要END IF;IF声明的末尾。

子选择必须用括号括起来:

    IF (SELECT count(*) FROM orders) > 0 ...

要么:

    IF (SELECT count(*) > 0 FROM orders) ...

这是等效的,但速度更快:

    IF EXISTS (SELECT FROM orders) ...

另类

SELECT不需要额外的。这样做一样,更快:

DO
$do$
BEGIN
   DELETE FROM orders;
   IF NOT FOUND THEN
      INSERT INTO orders VALUES (1,2,3);
   END IF;
END
$do$

尽管不太可能,但并发事务写入同一表可能会造成干扰。绝对可以肯定,在进行演示之前,将表写锁定在同一事务中。


不起作用 我收到错误:“%”或附近有语法错误LINE 89:%do%
Luffydude

11
@Luffydude:%在我的代码中哪里可以找到?IOW:上面的语句工作,您引入了一个不相关的语法错误。看起来像您键入的是%do%而不是$do$
Erwin Brandstetter

39

只是为了帮助任何人像我一样迷失在这个问题上,如果您想在PostgreSQL中使用if,请使用“ CASE”

select 
    case
        when stage = 1 then 'running'
        when stage = 2 then 'done'
        when stage = 3 then 'stopped'
    else 
        'not running'
    end as run_status from processes

7

来自文档

IF boolean-expression THEN
    statements
ELSE
    statements
END IF;

因此,在上面的示例中,代码应如下所示:

IF select count(*) from orders > 0
THEN
  DELETE from orders
ELSE 
  INSERT INTO orders values (1,2,3);
END IF;

您不见了:END IF;


3
是的,我尝试过,但是没有用。错误:“ if”或附近的语法错误
Vladimir Tsukanov

2
1.请不要链接Beta文档;2.您的示例需要包含在其中DO以用作SQL语句,而不是包含在PL / pgSQL函数中。
Milen A. Radev

@ MilenA.Radev是网站上可用的最新文档。此外,我在OP的最初文章中进行了构建,以显示该语句的正确语法。
Woot4Moo 2012年

@VladimirTsukanov您是否将select中的值分配给变量?
Woot4Moo 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.