本指南演示如何使用单个参数有效地将多个值传递给 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中文网其他相关文章!