Postgresql
將函式參數添加到 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 子句看起來像
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 函式中的****動態 SQL
EXECUTE
**可以實現更多功能。關於 SO 的更全面的答案以及完整的食譜: