PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Übergeben Sie mehrere Werte in einem einzigen Parameter

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