PostgreSQL IF语句

50pmv0ei  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(332)

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

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

db2dz4w81#

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(except for the final END)中,每条语句的末尾都需要一个分号(;)。
IF语句的末尾需要END 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在同一事务中的表。

d8tt03nd

d8tt03nd2#

如果有人像我一样在这个问题上犯了错,为了帮助他们,如果你想在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
myzjeezk

myzjeezk3#

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

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
icnyk63a

icnyk63a4#

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;

相关问题