Redrock Postgres 搜索 英文
版本: 9.3 / 9.4 / 9.5 / 9.6 / 10 / 11 / 12 / 13 / 14 / 15 / 16

43.4. 表达式 #

PL/pgSQL 语句中使用的所有表达式都使用服务器的主 SQL 执行器进行处理。例如,当您编写类似于以下的 PL/pgSQL 语句时

IF expression THEN ...

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

SELECT expression

在形成 SELECT 命令时,任何出现的 PL/pgSQL 变量名都将替换为查询参数,如 第 43.11.1 节 中详细讨论的那样。这允许仅准备一次 SELECT 的查询计划,然后将其重新用于具有不同变量值的后续评估。因此,在首次使用表达式时真正发生的事情本质上是一个 PREPARE 命令。例如,如果我们声明了两个整数变量 xy,并且我们编写

IF x < y THEN ...

幕后发生的事情等同于

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

然后为每次执行 IF 语句执行此准备好的语句,其中 PL/pgSQL 变量的当前值作为参数值提供。通常,这些详细信息对 PL/pgSQL 用户来说并不重要,但在尝试诊断问题时了解它们很有用。更多信息请参见 第 43.11.2 节

由于 expression 转换为 SELECT 命令,因此它可以包含普通 SELECT 将包含的相同子句,但它不能包含顶级 UNIONINTERSECTEXCEPT 子句。因此,例如,可以使用以下方法测试表是否非空

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

因为 IFTHEN 之间的 expression 被解析为 SELECT count(*) > 0 FROM my_table。该 SELECT 必须生成一列,且不超过一行。(如果它不生成任何行,则结果将被视为 NULL。)