VARIADIC
Jak podał @mu, VARIADIC
jest twoim przyjacielem. Jeszcze jeden ważny szczegół:
Możesz też wywołaj funkcję za pomocą VARIADIC
parametr bezpośrednio z typem tablicy. Dodaj słowo kluczowe VARIADIC
w wywołaniu funkcji:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
jest równoważne z:
SELECT * FROM f_test(1, 2, 3);
Inne porady
W Postgresie 9.1 lub nowszym right()
z negatywem długość jest szybsza i prostsza przy wycinaniu wiodących znaków z ciągu:
right(j.status, -2)
jest równoważne z:
substring(j.status, 3, char_length(jobs.status))
Masz j."DeleteFlag"
jak również j.DeleteFlag
(bez podwójnych cudzysłowów) w zapytaniu. To prawdopodobnie nieprawda. Zobacz:
- Błąd PostgreSQL:relacja już istnieje
"DeleteFlag" = '0'
wskazuje na inny problem. W przeciwieństwie do innych RDBMS, Postgres poprawnie obsługuje boolean
typ danych. Jeśli flaga zawiera boolean
dane (true
/ false
/ NULL
) użyj boolean
rodzaj. Typ znaku, taki jak text
byłoby niewłaściwe / nieefektywne.
Właściwe działanie
Nie potrzebujesz tutaj PL/pgSQL. możesz użyj prostszej funkcji 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<>graj tutaj
Stary sqlfiddle