我創建了一個用于過濾的函式
CREATE OR REPLACE FUNCTION filtersearch(
val1 text[] DEFAULT NULL::text[],
val2 text[] DEFAULT NULL::text[],
val3 text[] DEFAULT NULL::text[],
val4 boolean DEFAULT NULL::boolean)
RETURNS SETOF student_table
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
where_val text := '';
result_text int;
BEGIN
IF $4 = true THEN
where_val := 'attendance = true';
raise notice 'Value: %', where_val;
END IF;
RETURN QUERY EXECUTE
'SELECT * FROM student_table"
WHERE (LOWER("student_name") = ($1) OR $1 IS NULL)
AND ((LOWER("subject") = ($2)) OR $2 IS NULL)
AND ((LOWER("comments") ILIKE $3)
OR ($3 IS NULL)
)
'|| where_val ||'' USING where_val;
--raise notice 'Value: %', result_text;
END
$BODY$;
我在呼叫它時出錯,
錯誤:op ANY/ALL(陣列)需要右側的陣列
非常感謝我的代碼中的任何建議或評論
這是我的表的示例資料
| 學生姓名 | 主題 | 教授 | 評論 | 出勤率 |
|---|---|---|---|---|
| 阿米莉亞 | 數學 | 迪戈里·柯克爾 | 真的 | |
| 本杰明 | 科學 | 哈里·謝頓 | 錯誤的 | |
| 夏洛特 | 英語 | 李埃弗雷特 | 真的 | |
| 阿米莉亞 | 英語 | 李埃弗雷特 | 錯誤的 |
我像這樣呼叫代碼
SELECT filtersearch(
(array['Amelia, Charlotte']::text[]),
(NULL),
(NULL),
(true)
)
uj5u.com熱心網友回復:
SQL字串中的 $1、$2、$3 占位符參考通過命令USING子句傳遞的引數EXECUTE QUERY。您只傳遞一個引數,即''或 字串'attendance = true'- 兩者都不能用于IN條件。
因此,您需要使用 USING 子句傳遞三個引數,而不是您附加到 SQL 查詢的字串。如果您使用 ILIKE,則無需在lower()該條件下使用。您的where_val字串也缺少一個AND(或一個OR)
CREATE OR REPLACE FUNCTION filtersearch(
val1 text[] DEFAULT NULL::text[],
val2 text[] DEFAULT NULL::text[],
val3 text[] DEFAULT NULL::text[],
val4 boolean DEFAULT NULL::boolean)
RETURNS SETOF student_table
LANGUAGE plpgsql
AS $BODY$
DECLARE
where_val text := '';
BEGIN
IF $4 = true THEN
where_val := 'AND attendance = true';
raise notice 'Value: %', where_val;
END IF;
RETURN QUERY EXECUTE
'SELECT *
FROM student_table
WHERE (LOWER(student_name) = ANY($1) OR $1 IS NULL)
AND (LOWER(subject") = ANY ($2) OR $2 IS NULL)
AND (LOWER("comments") ILIKE ANY($3) OR $3 IS NULL)
'|| where_val
USING val1, val2, val3; -- do NOT pass where_val here
END
$BODY$;
為此,您實際上并不需要動態 SQL。您可以應用與您嘗試使用布爾引數的前 3 個引數相同的邏輯。
CREATE OR REPLACE FUNCTION filtersearch(
val1 text[] DEFAULT NULL::text[],
val2 text[] DEFAULT NULL::text[],
val3 text[] DEFAULT NULL::text[],
val4 boolean DEFAULT NULL::boolean)
RETURNS SETOF student_table
LANGUAGE plpgsql
AS $BODY$
BEGIN
RETURN QUERY
SELECT *
FROM student_table
WHERE (LOWER(student_name) = any(val1) OR val1 IS NULL)
AND (LOWER(subject) = any(val2) OR val2 IS NULL)
AND (comments ILIKE ANY(val3) OR val3 IS NULL)
AND (attendance = val4 or val4 = false or val4 is null);
END
$BODY$;
你甚至不需要 PL/pgSQL 上面的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/380443.html
