PostgreSQLでは名前付きパラメータを持つ関数について、位置表記と名前付け表記のいずれでも呼び出すことが可能です。 名前付け表記は、パラメータと引数の関連をより明確・確実にするので、多数のパラメータを持つ関数において特に有用です。 位置表記の関数呼び出しでは、関数宣言で定義されたのと同じ並び順で、引数を記述します。 名前付け表記では、引数と関数パラメータは名前で対応付けられ、引数はどのような並び順で書いても構いません。 それぞれの表記で、10.3に書かれているように、関数の引数の型の効果も考慮してください。
どちらの表記でも、関数定義時にデフォルト値を与えられているパラメータについては、呼び出し時に記述される必要はありません。 しかしこれは、名前付け表記で特に有用です。 なぜなら、パラメータ群の任意の組み合わせを省略できるからです。 一方、位置表記のパラメータは右から左へ省略していくことしかできません。
PostgreSQLでは、名前付け表記と位置表記の混在表記もサポートしています。この場合、位置表記のパラメータが最初に記述され、その後に名前付け表記のパラメータが記述されることになります。
本節の例では、次の関数定義を使って、3通りすべての表記方法について説明します。
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
の指定必須となる2つのパラメータを持ちます。
加えて、uppercase
というデフォルトがfalse
となっている省略可能なパラメータを一つ持ちます。
a
とb
で入力された文字列が結合され、uppercase
パラメータにより大文字か小文字に変換されます。
他のこの関数定義についての詳細は、ここでは重要ではありません。(詳細は第38章を参照して下さい。)
位置表記は、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
に設定されます。
名前付け表記の使用の利点の1つとして、引数を任意の順序で指定できる点があります。
以下に例を示します。
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
は名前で指定されています。
この例では文書化の目的以外ほとんど意味がありません。
デフォルト値が割り当てられた多くのパラメータを持つ、もっと複雑な関数では、名前付けもしくは混在表記により記述量を大きく減らすことができ、かつ、エラーが紛れ込む可能性を抑えることができます。
名前付けと混在呼び出し表記は集約関数の呼び出しでは現在使用できません(が、集約関数がウィンドウ関数として使われる場合には動作します)。