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

4.3. 调用函数 #

PostgreSQL 允许对带命名参数的函数使用位置记法或命名记法来调用。命名记法对于拥有大量参数的函数尤其有用,因为它能让形参与实参之间的对应关系更明确、更可靠。在位置记法中,函数调用中的参数值按照它们在函数声明中定义的顺序书写;在命名记法中,实参与函数参数按名称匹配,因此可以按任意顺序书写。对于每一种记法,还要考虑函数参数类型的影响,这一点在Section 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 参数的值转换成大写或小写。该函数定义的其余细节在这里并不重要(详见Chapter 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 采用命名方式指定。在这个示例中,这样做除了起到一定说明作用外并没有太多额外价值。但对于拥有大量带默认值参数的更复杂函数,命名记法或混合记法可以大幅减少书写量,并降低出错机会。

Note

命名调用记法和混合调用记法目前不能用于调用聚合函数(但当聚合函数被用作窗口函数时,它们是可以使用的)。

提交更正

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