VARIADIC
Giống như @mu đã cung cấp, VARIADIC
là bạn của bạn. Một chi tiết quan trọng nữa:
Bạn cũng có thể gọi một hàm bằng VARIADIC
tham số với kiểu mảng trực tiếp. Thêm từ khóa VARIADIC
trong lệnh gọi hàm:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
tương đương với:
SELECT * FROM f_test(1, 2, 3);
Lời khuyên khác
Trong Postgres 9.1 trở lên right()
với một phủ định độ dài nhanh hơn và đơn giản hơn để cắt các ký tự đầu khỏi một chuỗi:
right(j.status, -2)
tương đương với:
substring(j.status, 3, char_length(jobs.status))
Bạn có j."DeleteFlag"
cũng như j.DeleteFlag
(không có dấu ngoặc kép) trong truy vấn của bạn. Điều này có lẽ không chính xác. Xem:
- Lỗi PostgreSQL:Đã tồn tại mối quan hệ
"DeleteFlag" = '0'
chỉ ra một vấn đề khác. Không giống như các RDBMS khác, Postgres hỗ trợ đúng cách boolean
loại dữ liệu. Nếu cờ giữ boolean
dữ liệu (true
/ false
/ NULL
) sử dụng boolean
gõ phím. Một loại ký tự như text
sẽ không phù hợp / không hiệu quả.
Chức năng phù hợp
Bạn không cần PL / pgSQL ở đây. Bạn có thể sử dụng một hàm SQL đơn giản hơn:
CREATE OR REPLACE FUNCTION f_test(VARIADIC int[])
RETURNS TABLE (id int, reference int, job_title text, status text)
LANGUAGE sql AS
$func$
SELECT j.id, j.reference, j.job_title
, ltrim(right(j.status, -2)) AS status
FROM company c
JOIN job j USING (id)
WHERE c.active
AND NOT c.delete_flag
AND NOT j.delete_flag
AND (j.id = ANY($1) OR '{-1}'::int[] = $1)
ORDER BY j.job_title
$func$;
db <> fiddle here
Sqlfiddle cũ