2015-10-09 57 views
0

好了,所以我用了一个string_agg这样。在PLPGSQL函数中使用变量

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', ',')); 

现在我希望把这个功能,这样不是把acturally名进入string_to_array,我可以叫string_agg。

我是新来的Pos​​tgres和我没有找到如何做到这一点的在线任何好的文档。我相信我将不得不宣布该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

您可以使用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(); 
+0

是工作正常的事,但我想这样做,基本上宣告string_agg作为一个变量,所以当我想打电话给多行我可以只调用变量,而不必输入这种方式他们所有的名字。 –

+0

这正是我想要的东西! –