受支持版本: 当前版本 (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。)

提交更正

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