4.3. 通话功能

PostgreSQL 允许使用* positional named *表示法调用具有命名参数的函数。命名符号对于具有大量参数的函数特别有用,因为它使参数与实际参数之间的关联更加明确和可靠。在位置表示法中,函数调用的参数值以与函数声明中定义的 Sequences 相同的 Sequences 编写。在命名符号中,参数按名称与功能参数匹配,并且可以按任何 Sequences 编写。对于每种表示法,还应考虑函数自变量类型的影响,这些影响在Section 10.3中记录。

无论使用哪种表示法,都完全不需要在调用中写入具有函数声明中提供的默认值的参数。但这在命名符号中特别有用,因为可以省略参数的任何组合。而在位置表示法中,只能从右到左省略参数。

PostgreSQL 还支持* mixed *表示法,它结合了位置表示法和命名表示法。在这种情况下,首先写入位置参数,然后在它们之后显示命名参数。

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

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,默认为falseabImporting 将被串联,并根据uppercase参数被强制为大写或小写。此函数定义的其余详细信息在这里并不重要(有关更多信息,请参见Chapter 38)。

4 .3.1. 使用位置表示法

位置表示法是将参数传递给 PostgreSQL 中的函数的传统机制。一个例子是:

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

所有参数均按 Sequences 指定。由于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。使用命名表示法的一个优点是可以以任何 Sequences 指定参数,例如:

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

当前,在调用聚合函数时,不能使用命名和混合调用符号(但是当聚合函数用作窗口函数时,它们确实起作用)。