PostgreSQL 9.4.5文書 | |||
---|---|---|---|
前のページ | 上に戻る | 第 4章SQLの構文 | 次のページ |
PostgreSQLは位置と名前付け表記による名前付けパラメータを関数に持たせることが可能です。 特に名前付け表記は、多数のパラメータを持つ関数においてパラメータと引数の関連をより明確・確実にするのに有用です。 位置表記では、関数定義の際に定義されたものと同じ並び順の引数が、関数呼び出しに記述されることになります。 名前付け表記では、引数と関数パラメータの名前を一致させることになり、引数はどのような並び順でも構いません。
どちらの表記でも、パラメータが関数定義時にデフォルト値を与えられていれば呼び出し時に記述される必要はありません。 これは、名前付け表記では、パラメータ群の任意の組み合わせを省略することができるので、特殊なケースでは有用です。 一方、位置表記のパラメータは右から左へ省略していくことしかできません。
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パラメータにより大文字か小文字に変換されます。他のこの関数定義についての詳細は、ここでは重要ではありません。( 詳細は第35章を参照して下さい。)
位置表記は、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('Hello', 'World', uppercase := true); concat_lower_or_upper ----------------------- HELLO WORLD (1 row)
上記の問い合わせでは、aとbが位置で指定され、uppercaseは名前で指定されています。この例では文書化の目的以外ほとんど意味がありません。デフォルト値が割り当てられた多くのパラメータを持つ、もっと複雑な関数では、名前付けもしくは混在表記により記述量を大きく減らすことができ、かつ、エラーが紛れ込む可能性を抑えることができます。
注意: 名前付けと混在呼び出し表記は集約関数の呼び出しでは現在使用できません(が、集約関数がウィンドウ関数として使われる場合には動作します)。