Panduan ini menunjukkan cara menghantar berbilang nilai dengan cekap kepada fungsi PostgreSQL menggunakan satu parameter, memfokuskan pada jenis VARIADIC
dan menawarkan strategi pengoptimuman.
VARIADIC
ParameterJenis VARIADIC
PostgreSQL menawarkan penyelesaian ringkas untuk mengendalikan berbilang nilai input dalam satu parameter. Mari sesuaikan fungsi contoh:
<code class="language-sql">CREATE OR REPLACE FUNCTION test(VARIADIC int[]) RETURNS TABLE (job_id int, job_reference int, job_job_title text, job_status text) AS $$ BEGIN RETURN QUERY SELECT j.id, j.reference, j.job_title, ltrim(right(j.status, -2)) AS status -- Optimized string trimming FROM jobs j JOIN company c ON j.id = c.id WHERE c.active AND NOT c.delete_flag AND NOT j.delete_flag AND (j.id = ANY() OR '{<b>-1</b>}'::int[] = ) ORDER BY j.job_title; END; $$ LANGUAGE plpgsql;</code>
Fungsi yang disemak ini menerima tatasusunan integer (int[]
) sebagai input. Kata kunci VARIADIC
membolehkan fungsi menerima nombor pembolehubah argumen integer, menukarnya secara automatik kepada tatasusunan.
VARIADIC
Fungsi ini boleh digunakan terus menggunakan tatasusunan:
<code class="language-sql">SELECT * FROM test(<b>VARIADIC</b> '{1, 2, 3}'::int[]);</code>
Ini bersamaan fungsinya dengan:
<code class="language-sql">SELECT * FROM test(1, 2, 3);</code>
Pemangkasan Rentetan yang Cekap: Untuk PostgreSQL 9.1 dan lebih baru, menggunakan right()
dengan panjang negatif (right(j.status, -2)
) menyediakan kaedah yang lebih pantas dan bersih untuk mengalih keluar aksara utama berbanding substring()
.
Pertimbangan Jenis Data: Jika DeleteFlag
mewakili nilai boolean, menggunakan boolean
jenis data adalah lebih cekap dan betul dari segi semantik daripada text
. Elakkan petikan berganda yang tidak perlu di sekitar nama lajur dalam fasal WHERE
.
Untuk kebolehbacaan yang dipertingkatkan dan potensi keuntungan prestasi, pertimbangkan pelaksanaan SQL tulen:
<code class="language-sql">CREATE OR REPLACE FUNCTION f_test(VARIADIC int[]) RETURNS TABLE (id int, reference int, job_title text, status text) AS $func$ SELECT j.id, j.reference, j.job_title , ltrim(right(j.status, -2)) AS status FROM job j JOIN company c ON j.id = c.id WHERE c.active AND NOT c.delete_flag AND NOT j.delete_flag AND (j.id = ANY() OR '{-1}'::int[] = ) ORDER BY j.job_title $func$ LANGUAGE sql;</code>
Versi ringkas ini mencapai kefungsian yang sama dengan ketepatan yang dipertingkatkan. Ingat untuk melaraskan nama jadual dan lajur agar sepadan dengan skema khusus anda.
Atas ialah kandungan terperinci Bagaimana untuk Meluluskan Berbilang Nilai kepada Fungsi PostgreSQL Menggunakan Parameter Tunggal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!