2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0

4.3. 调用函数 #

PostgreSQL 允许具有命名参数的函数使用位置命名表示法来调用。命名表示法对于具有大量参数的函数特别有用,因为它使参数与实际参数之间的关联更加明确和可靠。在位置表示法中,函数调用按照其声明中的参数定义顺序编写其参数值。在命名表示法中,参数通过名称与函数参数匹配,并且可以按任意顺序编写。对于每种表示法,还要考虑函数参数类型的影响,这在第 10.3 节中有说明。

在这两种表示法中,在函数声明中已给出默认值的参数可以在调用时完全省略。但这在命名表示法中尤其有用,因为可以省略任何参数的组合;而在位置表示法中,参数只能从右到左省略。

PostgreSQL 还支持混合表示法,该表示法结合了位置表示法和命名表示法。在这种情况下,位置参数先写,命名参数后出现。

以下示例将说明所有三种表示法的用法,使用以下函数定义:

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
 SELECT CASE
        WHEN $3 THEN UPPER($1 || ' ' || $2)
        ELSE LOWER($1 || ' ' || $2)
        END;
$$
LANGUAGE SQL IMMUTABLE STRICT;

函数 concat_lower_or_upper 有两个必需参数 ab。此外,还有一个可选参数 uppercase,其默认值为 falseab 的输入将连接起来,并根据 uppercase 参数强制转换为大写或小写。此函数定义的其余详细信息在此处不重要(有关更多信息,请参阅第 36 章)。

4.3.1. 使用位置表示法 #

位置表示法是 PostgreSQL 中向函数传递参数的传统机制。示例如下:

SELECT concat_lower_or_upper('Hello', 'World', true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

所有参数都按顺序指定。结果是大写,因为 uppercase 指定为 true。另一个示例是:

SELECT concat_lower_or_upper('Hello', 'World');
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

在此,uppercase 参数被省略,因此它接收其默认值 false,从而导致小写输出。在位置表示法中,只要参数有默认值,就可以从右到左省略参数。

4.3.2. 使用命名表示法 #

在命名表示法中,使用 => 指定每个参数的名称,以将其与参数表达式分隔开。例如:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World');
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

同样,uppercase 参数被省略,因此它隐式设置为 false。使用命名表示法的一个优点是参数可以按任意顺序指定,例如:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World');
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

为了向后兼容,支持基于“:=”的旧语法

SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

4.3.3. 使用混合表示法 #

混合表示法结合了位置表示法和命名表示法。但是,如前所述,命名参数不能出现在位置参数之前。例如:

SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

在上面的查询中,参数 ab 是通过位置指定的,而 uppercase 是通过名称指定的。在此示例中,这除了文档记录外,几乎没有其他作用。对于具有许多具有默认值的参数的更复杂的函数,命名或混合表示法可以节省大量的书写工作,并减少出错的可能性。

注意

命名和混合调用表示法目前不能用于调用聚合函数(但当聚合函数用作窗口函数时,它们可以工作)。

提交更正

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