web-dev-qa-db-ja.com

SQLクエリのWHERE句に関数パラメーターを追加する

Java=にWebアプリケーションがあり、クエリを使用しています。クエリをJavaに書きたくないので、関数を作成しました。

CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS 
$$
    SELECT .... FROM ...
    JOIN ...
    where true
    ;
$$
LANGUAGE SQL;

関数パラメーターINPUTSもWHERE句に含めたいので、入力が

AND speed = 0 AND ....

句は次のようになります

where true AND speed = 0 AND ... 

どうすればこれを達成できますか?

[〜#〜]編集[〜#〜]

また、多くのパラメーター(a int、b string、c string ..)を使用することもできますが、その場合は

WHERE speed = * AND stop = * AND ...

これは受け入れられません。どうすればこれを達成できますか?

または、その中にifステートメントを挿入できますか?お気に入り

Select .. . from ...
JOIN ... 
WHERE true
IF (a != null){AND speed = $1}
IF ....
;
6
Hans

allパラメータを常に渡さない場合は、-parameter defaultsを指定して関数を作成します。基本的で単純な形式は、動的SQLのないSQL関数です。

CREATE OR REPLACE FUNCTION func(_a int  = NULL
                              , _b text = NULL
                              , _c text = NULL)
  RETURNS TABLE(...) AS
$func$
    SELECT ... FROM ...
    WHERE (speed = $1 OR $1 IS NULL)
    AND   (stop  = $2 OR $2 IS NULL)
    ...
$func$  LANGUAGE sql;

これで、名前付き表記を使用して、任意の数のパラメーターで関数を呼び出すことができます。

SELECT * FROM func(_c => 'foo', _a => 123);  -- no _b, which defaults to NULL

呼び出しの 代入演算子は=>(または:= Postgres 9.4以前の場合)not=
見る:

余談ですが、 "string"はデータ型ではなく、textです。

plpgsql関数でEXECUTEを使用した動的SQLを使用すると、さらに多くのことが可能になります。

SOに関するより包括的な回答と完全なレシピ:

5

動的クエリを使用できます。こちらがそのページです。 「例40-1。動的クエリでの値の引用」の後の約3分の2を確認してください。しかし、それが述べているように、あなたは非常に注意する必要があります。このタイプのSQL作成をその場で行うと、SQLインジェクションの大きな穴になる可能性があります。

http://www.postgresql.org/docs/current/static/plpgsql-statements.html

1
Chris Woods