将函数参数添加到 SQL 查询 WHERE 子句

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)

Erw*_*ter 7

如果您不总是传递所有参数,请创建一个带有参数 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可以实现更多功能

更全面的答案与完整的食谱: