2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2

41.4. 表达式 #

PL/pgSQL语句中使用的所有表达式都由服务器的主执行器处理。SQL例如,当你写一个PL/pgSQL语句时,例如

IF expression THEN ...

PL/pgSQL 会通过向主 SQL 引擎提供类似以下的查询来评估表达式:

SELECT expression

在构造 SELECT 命令时,PL/pgSQL 变量名的任何出现都会被替换为查询参数,这在第 41.11.1 节中有详细讨论。这使得 SELECT 的查询计划可以只准备一次,然后在后续的表达式计算中使用不同的变量值重复使用。因此,在表达式首次使用时实际发生的事情本质上是一个 PREPARE 命令。例如,如果我们声明了两个整数变量 xy,并且我们写了

IF x < y THEN ...

幕后发生的事情等同于

PREPARE statement_name(integer, integer) AS SELECT $1 < $2;

然后,对于每次执行 IF 语句,都会执行此准备好的语句,并将 PL/pgSQL 变量的当前值作为参数值提供。通常,这些细节对于 PL/pgSQL 用户来说并不重要,但了解它们有助于诊断问题。更多信息请参阅第 41.11.2 节

由于一个 表达式 被转换为一个 SELECT 命令,它可以包含普通 SELECT 中的相同子句,只是它不能包含顶层的 UNIONINTERSECTEXCEPT 子句。因此,例如,你可以使用以下方法测试一个表是否非空:

IF count(*) > 0 FROM my_table THEN ...

因为 IFTHEN 之间的 表达式 被解析为 SELECT count(*) > 0 FROM my_table。该 SELECT 必须产生单列,并且不超过一行。(如果它不产生行,则结果被视为 NULL。)

提交更正

如果您在文档中发现任何不正确、与您在特定功能上的实际体验不符或需要进一步澄清的内容,请使用此表单报告文档问题。