PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

41.4. 表达式 #

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

IF expression THEN ...

PL/pgSQL 会通过向主 SQL 引擎提交 形如以下的查询来求值该表达式

SELECT expression

在构造 SELECT 命令时, PL/pgSQL 变量名的所有出现都会被查询参数替换, 如 Section 41.11.1 中详细讨论的那样。 这使得该 SELECT 的查询计划只需准备一次, 随后即可在不同变量值下的求值中被重用。因此, 第一次使用表达式时真正发生的事情本质上就是一条 PREPARE 命令。例如,假设我们声明了两个整数变量 x 和 y,并写下

IF x < y THEN ...

那么幕后发生的事情等价于

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

然后在 IF 语句的每次执行中, 这条预备语句都会被 EXECUTE, 并以 PL/pgSQL 变量的当前值作为参数值。 通常这些细节对 PL/pgSQL 用户并不重要, 但在诊断问题时了解它们会有帮助。 更多信息见 Section 41.11.2。

由于 expression 会被转换为 SELECT 命令,它可以包含普通 SELECT 所能包含的相同子句, 但不能包含顶层的 UNION、INTERSECT 或 EXCEPT 子句。 例如,可以用下面的方式测试一个表是否非空:

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

因为 IF 与 THEN 之间的 expression 会被解析为 SELECT count(*) > 0 FROM my_table。 这个 SELECT 必须产生单一的一列, 且不超过一行。(如果没有产生行,则结果被视为 NULL。)