1

我想通过在单个参数上传递多个值来调用函数,如下所示:

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;

有人可以帮助语法吗?甚至提供示例代码?

4

2 回答 2

5

VARIADIC

就像@mu 提供的一样,VARIADIC是你的朋友。还有一个重要的细节:

也可以VARIADIC直接使用具有数组类型的参数调用函数。VARIADIC在函数调用中添加关键字:

SELECT * FROM  f_test(VARIADIC '{1, 2, 3}'::int[]);

相当于:

SELECT * FROM  f_test(1, 2, 3);

其他建议

在 Postgres 9.1 或更高版本right()中,使用长度可以更快、更简单地从字符串中修剪前导字符:

right(j.status, -2)

相当于:

substring(j.status, 3, char_length(jobs.status))

您的查询中有j."DeleteFlag"以及j.DeleteFlag(不带双引号)。这可能是不正确的。看:

"DeleteFlag" = '0'表示另一个问题。与其他 RDBMS 不同,Postgres 正确地支持boolean数据类型。如果标志包含boolean数据 ( true/ false/ NULL),则使用boolean类型。像这样的字符类型text不合适/效率低下。

适当的功能

您在这里不需要 PL/pgSQL。您可以使用更简单的 SQL 函数:

CREATE OR REPLACE FUNCTION f_test(VARIADIC int[])
  RETURNS TABLE (id int, reference int, job_title text, status text)
  LANGUAGE sql 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$;

db<>fiddle here
sqlfiddle

于 2013-10-06T01:45:39.357 回答
4

不要做奇怪和可怕的事情,比如将整数列表转换为 CSV 字符串,这样:

jobTitle('270,378')

不是你想要的。你想说这样的话:

jobTitle(270, 378)
jobTitle(array[270, 378])

如果您要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

然后,您可以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

然后您可以jobTitle(array[6]), jobTitle(array[6, 11]), ... 根据需要使用所有常用的数组运算符和函数来为jobTitle.

我将把函数的内部作为练习留给读者。

于 2013-10-05T21:38:13.817 回答