PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Passer plusieurs valeurs dans un seul paramètre

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