如何在 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);
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$
尽管不太可能,写入同一个表的并发事务可能会干扰。绝对可以肯定的是,在按照演示继续之前,将表写锁定在同一个事务中。
如果有人像我一样偶然发现这个问题,只是为了帮助,如果你想在 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
您还可以使用带有匿名代码块过程块的 PL/pgSQL CASE 的基本结构:
DO $$ BEGIN
CASE
WHEN boolean-expression THEN
statements;
WHEN boolean-expression THEN
statements;
...
ELSE
statements;
END CASE;
END $$;
参考:
从文档
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;