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 有两个必需参数 a 和 b。此外还有一个可选参数 uppercase,其默认值为 false。a 和 b 的输入将被连接起来,并根据 uppercase 参数的值转换成大写或小写。该函数定义的其余细节在这里并不重要(详见Chapter 36)。
位置记法是在 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,结果是小写输出。在位置记法中,只要参数具有默认值,就可以从右向左依次省略。
在命名记法中,每个参数名都使用 => 与其参数表达式分隔。例如:
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)
混合记法结合了位置记法和命名记法。不过,如前所述,命名参数不能出现在位置参数之前。例如:
SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
在上面的查询中,参数 a 和 b 采用位置方式指定,而 uppercase 采用命名方式指定。在这个示例中,这样做除了起到一定说明作用外并没有太多额外价值。但对于拥有大量带默认值参数的更复杂函数,命名记法或混合记法可以大幅减少书写量,并降低出错机会。
命名调用记法和混合调用记法目前不能用于调用聚合函数(但当聚合函数被用作窗口函数时,它们是可以使用的)。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。