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

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 语句执行时EXECUTEd 为 PL/pgSQL 变量作为参数值提供的当前值。一般来说,这些详细信息对于 PL/pgSQL 用户来说并不重要,但是在诊断问题时了解这些细节非常有用。更多信息请参阅 第 41.11.2 节

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

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

因为 expression 介于 IFTHEN 被解析,就好像它是 SELECT count(*) > 0 FROM my_tableSELECT 必须生成一列,并且只能生成一行。(如果未生成任何行,结果将视为 NULL。)