VARIADIC
Wie @mu bereitgestellt, VARIADIC
ist dein Freund. Noch ein wichtiges Detail:
Sie können auch Rufen Sie eine Funktion mit einem VARIADIC
auf Parameter mit einem Array-Typ direkt. Fügen Sie das Schlüsselwort VARIADIC
hinzu im Funktionsaufruf:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
entspricht:
SELECT * FROM f_test(1, 2, 3);
Weitere Ratschläge
In Postgres 9.1 oder höher right()
mit einem Negativ length ist schneller und einfacher, führende Zeichen aus einer Zeichenfolge zu entfernen:
right(j.status, -2)
entspricht:
substring(j.status, 3, char_length(jobs.status))
Sie haben j."DeleteFlag"
sowie j.DeleteFlag
(ohne doppelte Anführungszeichen) in Ihrer Abfrage. Dies ist wahrscheinlich falsch. Siehe:
- PostgreSQL-Fehler:Beziehung existiert bereits
"DeleteFlag" = '0'
weist auf ein anderes Problem hin. Im Gegensatz zu anderen RDBMS unterstützt Postgres den boolean
ordnungsgemäß Datentyp. Wenn das Flag boolean
enthält Daten (true
/ false
/ NULL
) verwenden Sie den boolean
Typ. Ein Zeichentyp wie text
wäre unangemessen/ineffizient.
Einwandfreie Funktion
Sie benötigen hier kein PL/pgSQL. Sie können Verwenden Sie eine einfachere 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<>hier fummeln
Altes sqlfiddle