VARIADIC
Като @mu предоставено, VARIADIC
е твой приятел. Още една важна подробност:
Вие същоможете извикване на функция с помощта на VARIADIC
параметър с тип масив директно. Добавете ключовата дума VARIADIC
в извикването на функция:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
е еквивалентен на:
SELECT * FROM f_test(1, 2, 3);
Други съвети
В Postgres 9.1 или по-нова версия right()
с отрицателно дължината е по-бърза и по-лесна за изрязване на водещи знаци от низ:
right(j.status, -2)
е еквивалентен на:
substring(j.status, 3, char_length(jobs.status))
Имате j."DeleteFlag"
както и j.DeleteFlag
(без двойни кавички) във вашата заявка. Това вероятно е неправилно. Вижте:
- Грешка в PostgreSQL:Връзката вече съществува
"DeleteFlag" = '0'
показва друг проблем. За разлика от други RDBMS, Postgres поддържа правилно boolean
тип данни. Ако флагът съдържа boolean
данни (true
/ false
/ NULL
) използвайте boolean
Тип. Тип символ като text
би било неподходящо/неефективно.
Правилна функция
Тук нямате нужда от PL/pgSQL. Вие можете използвайте по-проста SQL функция:
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<>цигулка тук
Стар sqlfiddle