【发布时间】: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
如何在 Postgres 中进行这样的查询?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
【问题讨论】:
标签: sql postgresql if-statement plpgsql
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 表在同一个事务中,然后再按演示进行。
【讨论】:
%? IOW:上述语句有效,您引入了一个不相关的语法错误。您输入的似乎是 %do% 而不是 $do$。
如果有人像我一样偶然发现这个问题,只是为了提供帮助, 如果你想在 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
【讨论】:
您还可以使用带有anonymous code block 过程块的PL/pgSQL CASE 的基本结构:
DO $$ BEGIN
CASE
WHEN boolean-expression THEN
statements;
WHEN boolean-expression THEN
statements;
...
ELSE
statements;
END CASE;
END $$;
参考文献:
【讨论】:
来自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;
【讨论】:
DO 中才能用作 SQL 语句,而不是在 PL/pgSQL 函数中。
ERROR: syntax error at or near "if" –