我想通过在单个参数上传递多个值来调用函数,如下所示:
SELECT * FROM jobTitle('270,378');
这是我的功能。
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;
有人能帮上忙吗?或者提供示例代码?
最佳答案
比如说,@mu already provided是你的朋友。还有一个更重要的细节:
您还可以直接使用数组类型的VARIADIC
参数调用函数。在函数调用中添加关键字VARIADIC
:
SELECT * FROM f_test(VARIADIC '{1,2,3}'::int[]);
相当于:
SELECT * FROM f_test(1,2,3);
其他建议
在Postgres9.1+
VARIADIC
中,使用负长度修剪字符串的前导字符更快更简单:right(j.status, -2)
相当于:
substring(j.status, 3, char_length(jobs.status))
查询中既有
right()
也有j."DeleteFlag"
(不带双引号)。j.DeleteFlag
"DeleteFlag" = '0'
表示另一个问题。与其他RDBMS不同,Postgres完全正确地支持This is probably incorrect.数据类型。如果标志包含布尔数据(是/否/可能为空),请使用boolean
类型。Aboolean不合适。这里不需要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;
character type like
text