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
参数强制转换为大写或小写。此处,此函数定义的其余详细信息并不重要(有关更多信息,请参阅第 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
是按名称指定的。在此示例中,除了文档之外,它几乎没有添加任何内容。对于具有大量具有默认值的参数的更复杂的函数,命名或混合表示法可以节省大量编写工作并减少出错的机会。
当前无法在调用聚合函数时使用命名和混合调用表示法(但当聚合函数用作窗口函数时,它们确实有效)。
如果您在文档中看到任何不正确的内容,与您对特定功能的体验不符,或者需要进一步说明,请使用此表单报告文档问题。