Han*_*ans 7 postgresql dynamic-sql java functions
我在 Java 中有一个 Web 应用程序,它使用查询。我不想把查询写成Java,所以我做了一个函数:
CREATE OR REPLACE FUNCTION testFunc(inputs text) RETURNS TABLE(...) AS
$$
SELECT .... FROM ...
JOIN ...
where true
;
$$
LANGUAGE SQL;
Run Code Online (Sandbox Code Playgroud)
我希望函数参数 INPUTS 也位于 WHERE 子句中,因此如果输入是
AND speed = 0 AND ....
Run Code Online (Sandbox Code Playgroud)
Where 子句看起来像
where true AND speed = 0 AND ...
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
编辑
也可以接受许多参数(a int、b string、c string ..)但是我需要有
WHERE speed = * AND stop = * AND ...
Run Code Online (Sandbox Code Playgroud)
这是不可接受的。我怎样才能做到这一点?
或者我可以在里面放一个 if 语句吗?喜欢
Select .. . from ...
JOIN ...
WHERE true
IF (a != null){AND speed = $1}
IF ....
;
Run Code Online (Sandbox Code Playgroud)
如果您不总是传递所有参数,请创建一个带有参数 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;
Run Code Online (Sandbox Code Playgroud)
现在您可以使用命名符号调用具有任意数量参数的函数:
SELECT * FROM func(_c => 'foo', _a => 123); -- no _b, which defaults to NULL
Run Code Online (Sandbox Code Playgroud)
请注意,调用中=>:=的赋值运算符是(或对于 Postgres 9.4 或更早版本),而不是 =!
看:
旁白:“字符串”不是数据类型,text是。
使用 plpgsql 函数中的动态 SQLEXECUTE可以实现更多功能。
更全面的答案与完整的食谱:
| 归档时间: |
|
| 查看次数: |
13018 次 |
| 最近记录: |