PostgreSQL IF statement
如何在Postgres中进行此类查询?
1 2 3 4 5 | IF (SELECT COUNT(*) FROM orders) > 0 THEN DELETE FROM orders ELSE INSERT INTO orders VALUES (1,2,3); |
尝试:
1 2 3 4 5 6 7 8 9 10 | 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 除外)。 -
在
IF 语句的末尾需要END IF; 。 -
子选择需要用括号括起来:
1IF (SELECT COUNT(*) FROM orders) > 0 ...要么:
1IF (SELECT COUNT(*) > 0 FROM orders) ...这是等效的,但速度更快:
1IF EXISTS (SELECT FROM orders) ...
另类
实际上,您实际上根本不需要额外的
1 2 3 4 5 6 7 8 9 | DO $do$ BEGIN DELETE FROM orders; IF NOT FOUND THEN INSERT INTO orders VALUES (1,2,3); END IF; END $do$ |
尽管不太可能,但尝试写入同一表的并发事务可能会造成干扰。绝对可以肯定,在进行演示之前,将表写锁定在同一事务中。
只是为了帮助任何人像我一样偶然遇到这个问题,
如果要在PostgreSQL中使用if,请使用" CASE"
1 2 3 4 5 6 7 8 | 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 |
来自文档
1 2 3 4 5 | IF boolean-expression THEN statements ELSE statements END IF; |
因此,在上面的示例中,代码应如下所示:
1 2 3 4 5 6 | IF SELECT COUNT(*) FROM orders > 0 THEN DELETE FROM orders ELSE INSERT INTO orders VALUES (1,2,3); END IF; |
您不见了:END IF;
您还可以将PL / pgSQL CASE的基本结构与匿名代码块过程块一起使用:
1 2 3 4 5 6 7 8 9 10 11 | DO $$ BEGIN CASE WHEN boolean-expression THEN statements; WHEN boolean-expression THEN statements; ... ELSE statements; END CASE; END $$; |
参考文献: