VARIADIC
@muが提供するように、VARIADIC あなたの友だちです。もう1つの重要な詳細:
できます VARIADICを使用して関数を呼び出す 配列型のパラメータを直接。キーワードVARIADICを追加します 関数呼び出しで:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]); と同等です:
SELECT * FROM f_test(1, 2, 3);
その他のアドバイス
Postgres9.1以降の場合right() ネガティブ 長さは、文字列から先頭の文字をトリミングする方が速くて簡単です:
right(j.status, -2)
と同等です:
substring(j.status, 3, char_length(jobs.status))
j."DeleteFlag"があります j.DeleteFlagも同様です (二重引用符なしで)クエリで。これはおそらく正しくありません。参照:
- PostgreSQLエラー:リレーションはすでに存在します
"DeleteFlag" = '0' 別の問題を示します。他のRDBMSとは異なり、Postgresは booleanを適切にサポートします データ・タイプ。フラグがbooleanを保持している場合 データ(true / false / NULL )booleanを使用します タイプ。 textのような文字タイプ 不適切/非効率的です。
適切な機能
ここではPL/pgSQLは必要ありません。 できます より単純な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<>ここでフィドル
古いsqlfiddle