VARIADIC
Como @mu proporcionado, VARIADIC
es tu amigo. Otro detalle importante:
también puedes llamar a una función usando un VARIADIC
parámetro con un tipo de matriz directamente. Agregue la palabra clave VARIADIC
en la llamada de función:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
es equivalente a:
SELECT * FROM f_test(1, 2, 3);
Otros consejos
En Postgres 9.1 o posterior right()
con un negativo length es más rápido y sencillo para recortar los caracteres principales de una cadena:
right(j.status, -2)
es equivalente a:
substring(j.status, 3, char_length(jobs.status))
Tienes j."DeleteFlag"
así como j.DeleteFlag
(sin comillas dobles) en su consulta. Esto es probablemente incorrecto. Ver:
- Error de PostgreSQL:la relación ya existe
"DeleteFlag" = '0'
indica otro problema. A diferencia de otros RDBMS, Postgres admite adecuadamente el boolean
tipo de datos. Si la bandera contiene boolean
datos (true
/ false
/ NULL
) usa el boolean
tipo. Un tipo de carácter como text
sería inapropiado/ineficiente.
Funcionamiento adecuado
No necesita PL/pgSQL aquí. Tu puedes use una función SQL más 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<>violín aquí
Sqlfiddle antiguo