VARIADIC
Som @mu tillhandahålls, VARIADIC
är din vän. Ytterligare en viktig detalj:
Du kan också anropa en funktion med en VARIADIC
parameter med en matristyp direkt. Lägg till nyckelordet VARIADIC
i funktionsanropet:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
motsvarar:
SELECT * FROM f_test(1, 2, 3);
Andra råd
I Postgres 9.1 eller senare right()
med ett negativ längden är snabbare och enklare att trimma inledande tecken från en sträng:
right(j.status, -2)
motsvarar:
substring(j.status, 3, char_length(jobs.status))
Du har j."DeleteFlag"
samt j.DeleteFlag
(utan dubbla citattecken) i din fråga. Detta är förmodligen felaktigt. Se:
- PostgreSQL-fel:Relationen finns redan
"DeleteFlag" = '0'
indikerar ett annat problem. Till skillnad från andra RDBMS stöder Postgres korrekt boolean
data typ. Om flaggan håller boolean
data (true
/ false
/ NULL
) använd boolean
typ. En teckentyp som text
skulle vara olämpligt/ineffektivt.
Riktig funktion
Du behöver inte PL/pgSQL här. Du kan använd en enklare SQL-funktion:
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<>spela här
Gammal sqlfiddle