VARIADIC
Comme @mu fourni, VARIADIC
est votre ami. Un autre détail important :
Vous pouvez également appeler une fonction en utilisant un VARIADIC
paramètre avec un type de tableau directement. Ajouter le mot clé VARIADIC
dans l'appel de fonction :
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
est équivalent à :
SELECT * FROM f_test(1, 2, 3);
Autres conseils
Dans Postgres 9.1 ou version ultérieure right()
avec un négatif longueur est plus rapide et plus simple pour supprimer les premiers caractères d'une chaîne :
right(j.status, -2)
est équivalent à :
substring(j.status, 3, char_length(jobs.status))
Vous avez j."DeleteFlag"
ainsi que j.DeleteFlag
(sans les guillemets doubles) dans votre requête. Ceci est probablement incorrect. Voir :
- Erreur PostgreSQL :la relation existe déjà
"DeleteFlag" = '0'
indique un autre problème. Contrairement aux autres SGBDR, Postgres prend correctement en charge le boolean
Type de données. Si le drapeau contient boolean
données (true
/ false
/ NULL
) utilisez le boolean
taper. Un type de caractère comme text
serait inapproprié / inefficace.
Fonction correcte
Vous n'avez pas besoin de PL/pgSQL ici. Vous pouvez utilisez une fonction SQL plus simple :
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<>jouez ici
Vieux sqlfiddle