VARIADIC
Zoals @mu heeft opgegeven, VARIADIC
is jouw vriend. Nog een belangrijk detail:
U kunt ook roep een functie aan met een VARIADIC
parameter met een arraytype direct. Voeg het sleutelwoord VARIADIC
toe in de functie-aanroep:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
is gelijk aan:
SELECT * FROM f_test(1, 2, 3);
Ander advies
In Postgres 9.1 of hoger right()
met een negatief lengte is sneller en eenvoudiger om voorlooptekens uit een string te knippen:
right(j.status, -2)
is gelijk aan:
substring(j.status, 3, char_length(jobs.status))
Je hebt j."DeleteFlag"
evenals j.DeleteFlag
(zonder dubbele aanhalingstekens) in uw zoekopdracht. Dit is waarschijnlijk onjuist. Zie:
- PostgreSQL-fout:relatie bestaat al
"DeleteFlag" = '0'
wijst op een ander probleem. In tegenstelling tot andere RDBMS ondersteunt Postgres correct de boolean
data type. Als de vlag boolean
bevat gegevens (true
/ false
/ NULL
) gebruik de boolean
type. Een tekentype zoals text
zou ongepast / inefficiënt zijn.
Juiste functie
Je hebt hier geen PL/pgSQL nodig. Je kunt gebruik een eenvoudigere SQL-functie:
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<>viool hier
Oude sqlfiddle