sql >> Databasteknik >  >> RDS >> PostgreSQL

Skicka flera värden i en enda parameter

VARIADIC

Som @mu tillhandahålls, VARIADIC är din vän. Ytterligare en viktig detalj:

Du kan också anropa en funktion med en VARIADIC parameter med en matristyp direkt. Lägg till nyckelordet VARIADIC i funktionsanropet:

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

motsvarar:

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

Andra råd

I Postgres 9.1 eller senare right() med ett negativ längden är snabbare och enklare att trimma inledande tecken från en sträng:

right(j.status, -2)

motsvarar:

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

Du har j."DeleteFlag" samt j.DeleteFlag (utan dubbla citattecken) i din fråga. Detta är förmodligen felaktigt. Se:

  • PostgreSQL-fel:Relationen finns redan

"DeleteFlag" = '0' indikerar ett annat problem. Till skillnad från andra RDBMS stöder Postgres korrekt boolean data typ. Om flaggan håller boolean data (true / false / NULL ) använd boolean typ. En teckentyp som text skulle vara olämpligt/ineffektivt.

Riktig funktion

Du behöver inte PL/pgSQL här. Du kan använd en enklare 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<>spela här
Gammal sqlfiddle



  1. Efter att ha återställt min databasserie borttagen från kolumnen i Postgresql

  2. Intervjutips för SQL-databasadministratör

  3. Hur DATE_SUB() fungerar i MariaDB

  4. Låsa upp fördelarna med MariaDB:s Certified Associate Program