【问题标题】:PostgreSQL IF statementPostgreSQL IF 语句
【发布时间】:2012-07-03 04:24:57
【问题描述】:

如何在 Postgres 中进行这样的查询?

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

【问题讨论】:

    标签: sql postgresql if-statement plpgsql


    【解决方案1】:
    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 statement 是默认过程语言 PL/pgSQL 的一部分。您需要使用DO 命令创建函数或执行临时语句。

    您需要在 plpgsql (except for the final 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$
    

    虽然不太可能,写入同一个表的并发事务可能会干扰。可以肯定的是,write-lock 表在同一个事务中,然后再按演示进行。

    【讨论】:

    • 不起作用。我收到 ERROR: syntax error at or near "%" LINE 89: %do%
    • @Luffydude:你会在我的代码中哪里找到%? IOW:上述语句有效,您引入了一个不相关的语法错误。您输入的似乎是 %do% 而不是 $do$
    • 想知道为什么 PostgreSQL 不能像 T-SQL 那样简单吗?许多人想要跳上 pg 的障碍。
    【解决方案2】:

    如果有人像我一样偶然发现这个问题,只是为了提供帮助, 如果你想在 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
    

    【讨论】:

      【解决方案3】:

      您还可以使用带有anonymous code block 过程块的PL/pgSQL CASE 的基本结构:

      DO $$ BEGIN
          CASE
              WHEN boolean-expression THEN
                statements;
              WHEN boolean-expression THEN
                statements;
              ...
              ELSE
                statements;
          END CASE;
      END $$;
      

      参考文献:

      1. http://www.postgresql.org/docs/current/static/sql-do.html
      2. https://www.postgresql.org/docs/current/static/plpgsql-control-structures.html

      【讨论】:

        【解决方案4】:

        来自docs

        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;

        【讨论】:

        • 是的,我试过了,但它不起作用。错误:“if”处或附近的语法错误
        • 1.请不要链接 beta 文档; 2. 您的示例需要包含在DO 中才能用作 SQL 语句,而不是在 PL/pgSQL 函数中。
        • @MilenA.Radev 这是网站上提供的最新文档。此外,我正在构建 OP 的初始帖子以显示该语句的正确语法。
        • @VladimirTsukanov 您是否将选择中的值分配给变量?
        • 我也遇到了同样的错误ERROR: syntax error at or near "if" –
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多