2024 年 9 月 26 日: PostgreSQL 17 发布!
支持版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本: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 将通过馈送类似于以下的查询来评估表达式:

SELECT expression

到主 SQL 引擎。在形成 SELECT 命令时,任何 PL/pgSQL 变量名称的出现都将被查询参数替换,如 第 41.11.1 节 中详细讨论的那样。这使得可以只为 SELECT 准备一次查询计划,然后在后续评估中重复使用该计划,而使用变量的不同值作为参数值。因此,实际上,第一次使用表达式时发生的事情基本上是一个 PREPARE 命令。例如,如果我们声明了两个整数变量 xy,并且我们编写

IF x < y THEN ...

幕后发生的事情相当于

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

然后,此准备好的语句将在每次执行 IF 语句时被 EXECUTE,并提供当前 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。)

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符或需要进一步说明,请使用 此表格 报告文档问题。