如何在Postgres中进行这样的查询?
IF (select count(*) from orders) > 0 THEN DELETE from orders ELSE INSERT INTO orders values (1,2,3);
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
DO
END
;
END IF;
IF (SELECT count(*) FROM orders) > 0 ...
或者:
IF (SELECT count(*) > 0 FROM orders) ...
这是等效的,而且要快得多:
IF EXISTS (SELECT FROM orders) ...
不需要额外的SELECT。这是相同的,更快:
SELECT
DO $do$ BEGIN DELETE FROM orders; IF NOT FOUND THEN INSERT INTO orders VALUES (1,2,3); END IF; END $do$
虽然不太可能,但并发事务写入同一个表可能会造成干扰。为了确保万无一失,在按照演示的方式继续之前,write-lock在同一事务中的表。
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
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 $$;
参考文献:
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;
4条答案
按热度按时间db2dz4w81#
在标准SQL中没有过程元素。
IF
语句是默认过程语言PL/pgSQL的一部分。您需要使用DO
命令创建一个函数或执行一个临时语句。在plpgsql(except for the final
END
)中,每条语句的末尾都需要一个分号(;
)。在
IF
语句的末尾需要END IF;
。子选择必须用括号括起来:
或者:
这是等效的,而且要快得多:
备选
不需要额外的
SELECT
。这是相同的,更快:虽然不太可能,但并发事务写入同一个表可能会造成干扰。为了确保万无一失,在按照演示的方式继续之前,write-lock在同一事务中的表。
d8tt03nd2#
如果有人像我一样在这个问题上犯了错,为了帮助他们,如果你想在PostgreSQL中使用if,你可以使用“CASE”
myzjeezk3#
您也可以使用PL/pgSQL CASE的基本结构和anonymous code block过程块:
参考文献:
icnyk63a4#
从docs
因此,在上面的示例中,代码应该如下所示:
你失踪了:End IF;