sql >> Databáze >  >> RDS >> PostgreSQL

Předat více hodnot v jednom parametru

VARIADIC

Jako @mu poskytnutý, VARIADIC je tvůj přítel. Ještě jeden důležitý detail:

Můžete také volání funkce pomocí VARIADIC parametr přímo s typem pole. Přidejte klíčové slovo VARIADIC ve volání funkce:

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

je ekvivalentní:

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

Další rady

V Postgresu 9.1 nebo novějším right() s záporem délka je rychlejší a jednodušší ořezat úvodní znaky z řetězce:

right(j.status, -2)

je ekvivalentní:

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

Máte j."DeleteFlag" stejně jako j.DeleteFlag (bez uvozovek) ve vašem dotazu. Toto je pravděpodobně nesprávné. Viz:

  • Chyba PostgreSQL:Vztah již existuje

"DeleteFlag" = '0' naznačuje jiný problém. Na rozdíl od jiných RDBMS Postgres správně podporuje boolean datový typ. Pokud příznak obsahuje boolean data (true / false / NULL ) použijte boolean typ. Typ znaku jako text by bylo nevhodné/neefektivní.

Správná funkce

Zde nepotřebujete PL/pgSQL. můžete použijte jednodušší funkci SQL:

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<>zde hrajte
Starý sqlfiddle



  1. Vývoj modulu s Java 9 v Eclipse IDE, část 2

  2. Maximální počet záznamů v tabulce databáze MySQL

  3. Existuje SQL Server Profiler pro SQL Server Express?

  4. Jak nasadit aplikaci s databází serveru SQL na klientech