在plpgsql函数中使用变量

时间:2015-10-09 20:34:10

标签: postgresql plpgsql string-aggregation

好的,所以我使用了这样的string_agg。

select string_agg(DISTINCT first_name,', ' ORDER BY first_name) FROM person_test;

然后我写了这个以将值返回到表中。

SELECT *
FROM person_test
where first_name = ANY(string_to_array('Aaron,Anne', ','));

现在我想把它放在一个函数中,这样我就可以调用string_agg而不是将名字放入string_to_array中。

我是postgres的新手,并没有找到任何关于如何在线进行此操作的好文档。我相信我必须声明string_agg,然后在string_to_array中调用它,但我没有运气。

这是我的尝试,我知道这是正确的,但如果有人可以添加一些反馈。我在结果和ALAIS之间以及返回时遇到错误。

create or REPLACE FUNCTION select_persons(VARIADIC names TEXT[]);
declare results ALIAS select string_agg(DISTINCT first_name,', ' ORDER BY first_name) FROM person_test;
BEGIN
return setof person_test LANGUAGE sql as $$
  select * from person_test
  where first_name = any(results)
end;
$$ language sql;

1 个答案:

答案 0 :(得分:1)

您可以使用variable number of arguments创建一个功能。

示例:

create table person_test (id int, first_name text);
insert into person_test values
(1, 'Ann'), (2, 'Bob'), (3, 'Ben');

create or replace function select_persons(variadic names text[])
returns setof person_test language sql as $$
    select *
    from person_test
    where first_name = any(names)
$$;

select * from select_persons('Ann');
 id | first_name 
----+------------
  1 | Ann
(1 row)

select * from select_persons('Ann', 'Ben', 'Bob');
 id | first_name 
----+------------
  1 | Ann
  2 | Bob
  3 | Ben
(3 rows)

要在plpgsql函数中使用变量,您应该声明变量并使用select ... into(或赋值语句)。例如:

create or replace function my_func()
returns setof person_test
language plpgsql as $$
declare
    aggregated_names text;
begin
    select string_agg(distinct first_name,', ' order by first_name) 
    into aggregated_names
    from person_test;

    -- here you can do something using aggregated_names

    return query 
        select *
        from person_test
        where first_name = any(string_to_array(aggregated_names, ', '));
end $$;

select * from my_func();