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;
改訂:コメントで指摘されているように、この回答は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;
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