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