sql >> Database >  >> RDS >> PostgreSQL

Geef meerdere waarden door in één parameter

VARIADIC

Zoals @mu heeft opgegeven, VARIADIC is jouw vriend. Nog een belangrijk detail:

U kunt ook roep een functie aan met een VARIADIC parameter met een arraytype direct. Voeg het sleutelwoord VARIADIC toe in de functie-aanroep:

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

is gelijk aan:

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

Ander advies

In Postgres 9.1 of hoger right() met een negatief lengte is sneller en eenvoudiger om voorlooptekens uit een string te knippen:

right(j.status, -2)

is gelijk aan:

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

Je hebt j."DeleteFlag" evenals j.DeleteFlag (zonder dubbele aanhalingstekens) in uw zoekopdracht. Dit is waarschijnlijk onjuist. Zie:

  • PostgreSQL-fout:relatie bestaat al

"DeleteFlag" = '0' wijst op een ander probleem. In tegenstelling tot andere RDBMS ondersteunt Postgres correct de boolean data type. Als de vlag boolean bevat gegevens (true / false / NULL ) gebruik de boolean type. Een tekentype zoals text zou ongepast / inefficiënt zijn.

Juiste functie

Je hebt hier geen PL/pgSQL nodig. Je kunt gebruik een eenvoudigere SQL-functie:

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<>viool hier
Oude sqlfiddle



  1. hoe de begin- en einddatum van alle weken tussen twee datums in SQL-server te krijgen?

  2. CURRENT_TIMESTAMP Voorbeelden in SQL Server (T-SQL)

  3. Hoe gegevens ophalen uit een SQL Server-database in C#?

  4. Selectie verlenen voor alle tabellen die eigendom zijn van een specifieke gebruiker