受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发版本: devel

41.4. 表达式 #

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

IF expression THEN ...

PL/pgSQL会通过向主 SQL 引擎送入如下查询

SELECT expression

来计算该表达式。如 Section 41.11.1 中详细讨论的那样,在构造该 SELECT 命令时,PL/pgSQL 变量名的每一次出现都会被替换成查询参数。这使得该 SELECT 的查询计划只需准备一次,然后就能在后续以不同变量值求值时重用。因此,表达式第一次被使用时,实际发生的事情本质上相当于执行了一条 PREPARE 命令。例如,如果已经声明了两个整数变量 xy,并写下

IF x < y THEN ...

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

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

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

由于expression会被转换成一条SELECT命令,因此它可以包含普通SELECT能够包含的同类子句,只是不能包含顶层的UNIONINTERSECTEXCEPT子句。例如,可以这样测试一个表是否非空:

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

因为 IFTHEN 之间的expression会被解析为 SELECT count(*) > 0 FROM my_table。该SELECT必须产生单个列值,而且不能返回多于一行。(如果没有返回任何行,则结果被视为 NULL。)

提交更正

如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。