在 plpgsql 函数中使用变量
Using variables in a plpgsql function
好的,所以我使用了这样的 string_agg。
select string_agg(DISTINCT first_name,', ' ORDER BY first_name) FROM person_test;
然后我将这个return的值写到table。
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 之间以及 return 上遇到错误。
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;
您可以使用 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();
好的,所以我使用了这样的 string_agg。
select string_agg(DISTINCT first_name,', ' ORDER BY first_name) FROM person_test;
然后我将这个return的值写到table。
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 之间以及 return 上遇到错误。
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;
您可以使用 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();