sql >> Base de Datos >  >> RDS >> PostgreSQL

Pasar múltiples valores en un solo parámetro

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