web-dev-qa-db-ja.com

Postgres sql関数で名前付きパラメーターを参照するにはどうすればよいですか?

Postgresnoobieはこちら。

SQLServerのストアドプロシージャをPostgres関数に変換しようとしています。現在、このSQL行をPostgresに変換する方法を理解できません。

SQLサーバー:

input: @name = null

SELECT *
FROM table
WHERE name = ISNULL(@name, name)

Postgres:

input: n = null

SELECT *
FROM table
WHERE name = COALESCE(n, name)

「列nが存在しません」というエラーが表示されます。 Postgres関数のselectステートメントでパラメーターを参照するにはどうすればよいですか?

更新:

Postgres関数の定義

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE(n, u.name);

$$
LANGUAGE sql;
12
Nick Vaccaro

改訂:コメントで指摘されているように、この回答は2012年の初めに書かれたときは正確でしたが、名前付きパラメーターは2012年後半にリリースされたv9.2以降サポートされています。

関数が 言語SQL にある場合、パラメーター名は単なる装飾です。 language plpgsqlとして定義されたストアドプロシージャで、名前でパラメータを使用できます。

したがって、$ Xを使用して関数argsを参照する必要があります。ここで、Xは関数の引数リストの序数位置です(1から始まります)。

CREATE OR REPLACE FUNCTION fn_name (
  n VARCHAR(32) = NULL,
  OUT name varchar(32),
  OUT description varchar(64) )
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);
$$
LANGUAGE sql;
18
dbenhur

Language = SQLで定義されている関数で名前付きパラメーターを使用することはできません。

プレースホルダー$ 1を使用する必要があります。

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);

$$
LANGUAGE sql;

この動作はマニュアルに記載されています: http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

SQL関数自体に関する限り、これらの名前は単なる装飾です。関数本体内でパラメータを$ 1、$ 2などとして参照する必要があります

編集

バージョン9.2以降、(プレーンな)SQL関数で名前付きパラメーターを使用することが可能です。
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS

11