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 ....
;
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に関するより包括的な回答と完全なレシピ:
動的クエリを使用できます。こちらがそのページです。 「例40-1。動的クエリでの値の引用」の後の約3分の2を確認してください。しかし、それが述べているように、あなたは非常に注意する必要があります。このタイプのSQL作成をその場で行うと、SQLインジェクションの大きな穴になる可能性があります。
http://www.postgresql.org/docs/current/static/plpgsql-statements.html