PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Passe vários valores em um único parâmetro

VARIADIC


Como @mu fornecido, VARIADIC é seu amigo. Mais um detalhe importante:

Você também pode chamar uma função usando um VARIADIC parâmetro com um tipo de array diretamente. Adicione a palavra-chave VARIADIC na chamada da função:
SELECT * FROM  f_test(VARIADIC '{1, 2, 3}'::int[]);

é equivalente a:
SELECT * FROM  f_test(1, 2, 3);

Outros conselhos


No Postgres 9.1 ou posterior right() com um negativo length é mais rápido e simples para cortar os caracteres iniciais de uma string:
right(j.status, -2)

é equivalente a:
substring(j.status, 3, char_length(jobs.status))

Você tem j."DeleteFlag" bem como j.DeleteFlag (sem aspas duplas) em sua consulta. Isso provavelmente está incorreto. Ver:
  • Erro PostgreSQL:a relação já existe

"DeleteFlag" = '0' indica outro problema. Ao contrário de outros RDBMS, o Postgres suporta adequadamente o boolean tipo de dados. Se o sinalizador contém boolean dados (true / false / NULL ) use o boolean tipo. Um tipo de caractere como text seria inadequado/ineficiente.

Função adequada


Você não precisa de PL/pgSQL aqui. Você pode use uma função SQL mais simples:
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<>mexa aqui
antigo sqlfiddle