2015-10-09 93 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

這正是我想要的東西! –