sql >> Database teknologi >  >> RDS >> PostgreSQL

Send flere værdier i en enkelt parameter

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



  1. MySQL i 2018:Hvad er i 8.0 og andre observationer

  2. Hvordan opretter man en database med flere lejere med delte tabelstrukturer?

  3. PayPal ODBC-driver

  4. Sådan skriver du komplekse forespørgsler i SQL