Postgresql

將函式參數添加到 SQL 查詢 WHERE 子句

  • June 24, 2019

我在 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 子句看起來像

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 ....
;

如果您不總是傳遞所有參數,請創建一個帶有參數 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 或更早版本)而不是 =!

看:

旁白:“字元串”不是數據類型,text是。

**使用 plpgsql 函式中的****動態 SQLEXECUTE**可以實現更多功能。

關於 SO 的更全面的答案以及完整的食譜:

引用自:https://dba.stackexchange.com/questions/85970