2012-03-19 18 views
7

ここにはPostgres noobieがあります。PostgresのSQL関数で名前付きパラメータを参照する方法は?

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

SQL Serverの:

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文でパラメータを参照するにはどうすればよいですか?

UPDATE:Postgresの機能あなたが言語= SQLで定義されている機能で、名前付きパラメータを使用することはできません

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; 

答えて

13

ファンクションがlanguage SQLの場合、パラメータ名は装飾に過ぎません。 language plpgsqlとして定義されているストアドプロシージャの名前でパラメータを使用できます。

したがって、$ Xを使用して関数argsを参照する必要があります。ここで、Xは関数の引数リスト(1から始まる)の序数です。サポートは9.2 http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-以来存在しているという名前の別の答えに@a_horse_with_no_nameのポイントごと

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; 
+0

、ファンクション・アトリビュート –

8

定義。

プレースホルダ$ 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などのようなパラメータを参照する必要があります

編集、(無地)SQL関数で名前付きパラメータを使用することが可能であるバージョン9.2以来


http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS

関連する問題