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
有两个必需的参数,a
和b
。此外,还有一个可选参数uppercase
,其默认值为false
。将对a
和b
输入进行连接,并根据uppercase
参数强制转换为大写或小写。此函数定义的其余详细信息在此不重要(有关详细信息,请参见第 38 章)。
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)
在上面的查询中,参数a
和b
是按位置指定的,而uppercase
是按名称指定的。在此示例中,除了文档之外几乎没有添加任何内容。对于具有多个具有默认值的参数的更复杂函数,命名或混合表示法可以节省大量的编写工作并减少出错的可能性。
注意
在调用聚合函数时,目前不能使用命名和混合调用表示法(但在将聚合函数用作窗口函数时,它们确实有效)。