Postgresql 中文操作指南
4.3. Calling Functions #
PostgreSQL允许使用_positional_或_named_表示法调用具有命名参数的函数。对于具有大量参数的函数,命名表示法特别有用,因为它使参数和实际参数之间的关联更加明确和可靠。在位置表示法中,一个函数调用是用其参数值编写的,其顺序与在函数声明中定义的顺序相同。在命名表示法中,通过名称将参数与函数参数匹配,并且可以按任何顺序编写。对于每种表示法,还要考虑 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_有两个强制参数,a_和_b。此外,还有一个可选参数_uppercase_,其默认值是_false_。将_a_和_b_输入连接,并根据_uppercase_参数强制转换为大写或小写。此函数定义的其余详细信息在此处并不重要(有关更多信息,请参阅 Chapter 38)。
4.3.1. Using Positional Notation #
位置符号是将参数传递给 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. Using Named Notation #
在命名符号中,使用 ⇒ 指定每个参数的名称,以将其与参数表达式分开。例如:
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. Using Mixed Notation #
混合符号结合了位置符号和命名符号。但是,如前所述,命名参数不能位于位置参数之前。例如:
SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
concat_lower_or_upper
-----------------------
HELLO WORLD
(1 row)
在上文中,参数 a 和 b 是按位置指定的,而 uppercase 是按名称指定的。在此示例中,只有文档除外。如果函数较复杂,具有大量的参数且具有默认值,那么,命名符号或混合符号可以节省大量的书写,并降低出错的几率。