VARIADIC
Jako @mu poskytnutý, VARIADIC
je tvůj přítel. Ještě jeden důležitý detail:
Můžete také volání funkce pomocí VARIADIC
parametr přímo s typem pole. Přidejte klíčové slovo VARIADIC
ve volání funkce:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
je ekvivalentní:
SELECT * FROM f_test(1, 2, 3);
Další rady
V Postgresu 9.1 nebo novějším right()
s záporem délka je rychlejší a jednodušší ořezat úvodní znaky z řetězce:
right(j.status, -2)
je ekvivalentní:
substring(j.status, 3, char_length(jobs.status))
Máte j."DeleteFlag"
stejně jako j.DeleteFlag
(bez uvozovek) ve vašem dotazu. Toto je pravděpodobně nesprávné. Viz:
- Chyba PostgreSQL:Vztah již existuje
"DeleteFlag" = '0'
naznačuje jiný problém. Na rozdíl od jiných RDBMS Postgres správně podporuje boolean
datový typ. Pokud příznak obsahuje boolean
data (true
/ false
/ NULL
) použijte boolean
typ. Typ znaku jako text
by bylo nevhodné/neefektivní.
Správná funkce
Zde nepotřebujete PL/pgSQL. můžete použijte jednodušší funkci 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<>zde hrajte
Starý sqlfiddle