PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Passa più valori in un singolo parametro

VARIADIC

Come fornito da @mu, VARIADIC È tuo amico. Un altro dettaglio importante:

puoi anche chiama una funzione usando un VARIADIC parametro direttamente con un tipo di matrice. Aggiungi la parola chiave VARIADIC nella chiamata di funzione:

SELECT * FROM  f_test(VARIADIC '{1, 2, 3}'::int[]);

equivale a:

SELECT * FROM  f_test(1, 2, 3);

Altri consigli

In Postgres 9.1 o versioni successive right() con un negativo lunghezza è più semplice e veloce tagliare i caratteri iniziali da una stringa:

right(j.status, -2)

equivale a:

substring(j.status, 3, char_length(jobs.status))

Hai j."DeleteFlag" così come j.DeleteFlag (senza virgolette) nella tua query. Questo probabilmente non è corretto. Vedi:

  • Errore PostgreSQL:la relazione esiste già

"DeleteFlag" = '0' indica un altro problema. A differenza di altri RDBMS, Postgres supporta correttamente il boolean tipo di dati. Se il flag contiene boolean dati (true / false / NULL ) usa il boolean genere. Un tipo di carattere come text sarebbe inappropriato/inefficiente.

Funzione corretta

Non hai bisogno di PL/pgSQL qui. puoi usa una funzione SQL più semplice:

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<>gioca qui
Sqlfiddle vecchio