VARIADIC
Seperti yang diberikan @mu, VARIADIC
adalah temanmu. Satu lagi detail penting:
Anda juga bisa memanggil fungsi menggunakan VARIADIC
parameter dengan tipe array secara langsung. Tambahkan kata kunci VARIADIC
dalam panggilan fungsi:
SELECT * FROM f_test(VARIADIC '{1, 2, 3}'::int[]);
setara dengan:
SELECT * FROM f_test(1, 2, 3);
Saran lainnya
Di Postgres 9.1 atau yang lebih baru right()
dengan negatif panjang lebih cepat dan lebih sederhana untuk memangkas karakter utama dari string:
right(j.status, -2)
setara dengan:
substring(j.status, 3, char_length(jobs.status))
Anda memiliki j."DeleteFlag"
serta j.DeleteFlag
(tanpa tanda kutip ganda) dalam kueri Anda. Ini mungkin salah. Lihat:
- Kesalahan PostgreSQL:Relasi sudah ada
"DeleteFlag" = '0'
menunjukkan masalah lain. Tidak seperti RDBMS lainnya, Postgres dengan benar mendukung boolean
tipe data. Jika bendera memegang boolean
data (true
/ false
/ NULL
) gunakan boolean
Tipe. Tipe karakter seperti text
tidak tepat/tidak efisien.
Fungsi yang tepat
Anda tidak perlu PL/pgSQL di sini. Anda bisa gunakan fungsi SQL yang lebih sederhana:
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<>main biola di sini
sqlfiddle lama