PostgreSQL 9.4.4 中文手册
上一页 | 上一级 | 章 4. SQL语法 | 下一页

# 4.3. 调用函数

PostgreSQL允许函数有命名参数，可以被位置 或名称表示法调用。名称表示法对有大量参数的函数特别有用， 因为它更加明确和可靠的标记了形参和实参之间的联系。 在位置表示法里，一个函数调用的参数值要用与函数声明相同的顺序来写出。 在名称表示法里，参数是通过名称来与函数参数相匹配的，可以以任意顺序写出。

不管用那种表示法，在函数声明时给出的有默认值的参数在调用时不必写出。 但是这在名称表示法中是特别有用的，因为参数的任意组合都是可以省略的。 而在位置表示法中，参数只能从右到左省略。

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` 参数强制为大写或者小写。这个函数定义的其他详细资料在这并不重要（参阅第 35 章 获取更多信息）。

## 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)

## 4.3.3. 使用混合表示法

混合表示法结合了位置和名称表示法。然而，就像之前提到的，命名参数不可以在位置参数前面。例如：

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

在上面的查询中，参数`a`和`uppercase`是用位置声明的，而 `uppercase`是用名称声明的。在这个例子中，添加了文档中没有的一点。 在一个有多个参数有默认值的更复杂的函数中，名称或者混合表示法可以节省很多敲键， 并且可以减少犯错的几率。

> 注意: 在调用一个聚合函数时，目前不能使用名称和混合调用表示法 （但是当聚合函数用作窗口函数时，它们确实能运行）。

上一页 | 起始页 | 下一页
值表达式 | 上一级 | 数据定义