本指南示範如何使用單一參數有效地將多個值傳遞給 PostgreSQL 函數,重點在於 VARIADIC
類型並提供最佳化策略。
VARIADIC
參數PostgreSQL 的 VARIADIC
類型提供了一種簡潔的解決方案,用於處理單一參數中的多個輸入值。 讓我們調整一個範例函數:
<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>
此修改後的函數接受整數陣列 (int[]
) 作為輸入。 VARIADIC
關鍵字使函數能夠接受可變數量的整數參數,並自動將它們轉換為陣列。
VARIADIC
可以使用陣列直接呼叫函數:
<code class="language-sql">SELECT * FROM test(<b>VARIADIC</b> '{1, 2, 3}'::int[]);</code>
這在功能上等同於:
<code class="language-sql">SELECT * FROM test(1, 2, 3);</code>
高效字串修剪: 對於PostgreSQL 9.1 及更高版本,與right()
相比,使用帶有負長度(right(j.status, -2)
) 的substring()
可以提供更快、更乾淨的方法來刪除前導字元。
資料型態注意事項: 如果 DeleteFlag
表示布林值,則使用 boolean
資料型別比 text
更有效率且語意更正確。 避免在 WHERE
子句中的列名周圍使用不必要的雙引號。
為了增強可讀性和潛在的效能提升,請考慮純 SQL 實作:
<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>
這個簡化版本實現了相同的功能,但更簡潔。 請記住調整表和列名稱以符合您的特定架構。
以上是如何使用單一參數將多個值傳遞給 PostgreSQL 函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!