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