如何在Postgres中进行此类查询?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
如何在Postgres中进行此类查询?
IF (select count(*) from orders) > 0
THEN
DELETE from orders
ELSE
INSERT INTO orders values (1,2,3);
Answers:
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$
尽管不太可能,但并发事务写入同一表可能会造成干扰。绝对可以肯定,在进行演示之前,将表写锁定在同一事务中。
%
在我的代码中哪里可以找到?IOW:上面的语句工作,您引入了一个不相关的语法错误。看起来像您键入的是%do%
而不是$do$
。
来自文档
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函数中。
您还可以将PL / pgSQL CASE的基本结构与匿名代码块过程块一起使用:
DO $$ BEGIN
CASE
WHEN boolean-expression THEN
statements;
WHEN boolean-expression THEN
statements;
...
ELSE
statements;
END CASE;
END $$;
参考文献: