Nav*_*een 1 sql postgresql stored-procedures plpgsql parameter-passing
我想通过在单个参数上传递多个值来调用函数,如下所示:
SELECT * FROM jobTitle('270,378');
Run Code Online (Sandbox Code Playgroud)
这是我的功能。
CREATE OR REPLACE FUNCTION test(int)
RETURNS TABLE (job_id int, job_reference int, job_job_title text
, job_status text) AS
$$
BEGIN
RETURN QUERY
select jobs.id,jobs.reference, jobs.job_title,
ltrim(substring(jobs.status,3,char_length(jobs.status))) as status
FROM jobs ,company c
WHERE jobs."DeleteFlag" = '0'
and c.id= jobs.id and c.DeleteFlag = '0' and c.active = '1'
and (jobs.id = $1 or -1 = $1)
order by jobs.job_title;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
有人可以提供语法帮助吗?甚至提供示例代码?
不要做奇怪和可怕的事情,比如将整数列表转换为 CSV 字符串,如下:
jobTitle('270,378')
Run Code Online (Sandbox Code Playgroud)
不是你想要的。你想说这样的话:
jobTitle(270, 378)
jobTitle(array[270, 378])
Run Code Online (Sandbox Code Playgroud)
如果您要jobTitle手动调用,那么可变参数函数可能是最容易使用的:
create or replace function jobTitle(variadic int[])
returns table (...) as $$
-- $1 will be an array if integers in here so UNNEST, IN, ANY, ... as needed
Run Code Online (Sandbox Code Playgroud)
然后您可以根据需要jobTitle(6),,,,...。jobTitle(6, 11)jobTitle(6, 11, 23, 42)
如果您要jobTitle在 SQL 中构建参数,那么显式数组版本可能会更容易使用:
create or replace function jobTitle(int[])
returns table (...) as $$
-- $1 will be an array if integers in here so UNNEST, IN, ANY, ... as needed
Run Code Online (Sandbox Code Playgroud)
然后您可以jobTitle(array[6]), jobTitle(array[6, 11]), ... 根据需要,您可以使用所有常用的数组运算符和函数来构建 的参数列表jobTitle。
我将把函数的内部结构留给读者作为练习。
就像已经提供的@mu一样,VARIADIC是您的朋友。一个更重要的细节:
您还可以VARIADIC直接使用带有数组类型的参数来调用函数。VARIADIC在函数调用中添加关键字:
SELECT * FROM f_test(VARIADIC '{1,2,3}'::int[]);Run Code Online (Sandbox Code Playgroud)
等效于:
SELECT * FROM f_test(1,2,3);
Run Code Online (Sandbox Code Playgroud)
在Postgres 9.1+中right(),使用负数长度可以更快,更容易地修剪字符串中的前导字符:
right(j.status, -2)
Run Code Online (Sandbox Code Playgroud)
等效于:
substring(j.status, 3, char_length(jobs.status))
Run Code Online (Sandbox Code Playgroud)您的查询中有j."DeleteFlag"以及j.DeleteFlag(没有双引号)。这可能是不正确的。
"DeleteFlag" = '0'表示另一个问题。与其他RDBMS不同,Postgres完全正确地支持布尔数据类型。如果该标志包含布尔数据(是/否/可能为NULL),则使用该boolean类型。像text这样的字符类型是不合适的。
您在这里不需要plpgsql。您可以为此使用更简单的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 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$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3510 次 |
| 最近记录: |