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