VARIADIC
Som @mu angivet, VARIADIC
er din ven. Endnu en vigtig detalje:
Du kan også kalde en funktion ved hjælp af en VARIADIC
parameter med en matrixtype direkte. Tilføj nøgleordet VARIADIC
i funktionskaldet:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
svarer til:
SELECT * FROM f_test(1, 2, 3);
Andre råd
I Postgres 9.1 eller senere right()
med et negativ længden er hurtigere og nemmere at trimme indledende tegn fra en streng:
right(j.status, -2)
svarer til:
substring(j.status, 3, char_length(jobs.status))
Du har j."DeleteFlag"
samt j.DeleteFlag
(uden dobbelte anførselstegn) i din forespørgsel. Dette er sandsynligvis forkert. Se:
- PostgreSQL-fejl:Relationen eksisterer allerede
"DeleteFlag" = '0'
indikerer et andet problem. I modsætning til andre RDBMS understøtter Postgres korrekt boolean
datatype. Hvis flaget holder boolean
data (true
/ false
/ NULL
) brug boolean
type. En tegntype som text
ville være uhensigtsmæssig / ineffektiv.
Korrekt funktion
Du behøver ikke PL/pgSQL her. Du kan brug en enklere SQL-funktion:
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<>spil her
Gamle sqlfiddle