我有一组具有以下模式的函数:
create or replace function example_1(x1 integer)
returns table (y integer) as $$
select ...
$$ language sql immutable;
create or replace function example_2(x1 integer, x2 integer)
returns table (y integer) as $$
select ...
$$ language sql immutable;
create or replace function example_N(x1 integer, x2 integer, ..., xN integer)
returns table (y integer) as $$
select ...
$$ language sql immutable;
我想创建一个单独的函数来封装上面的函数:
create or replace function example(x integer[])
returns table (y integer) as $$
select case length(x, 1)
when 1 then example_1(x[1])
when 2 then example_2(x[1], x[2])
...
when N then select example_2(x[1], x[2], ..., x[N])
end
$$ language sql immutable;
问题是 CASE 中不允许设置返回函数。
ERROR: set-returning functions are not allowed in CASE LINE 9: else (example_2(x[1], x[2]^ HINT: You might be able to move the set-returning function into a LATERAL FROM item. SQL state: 0A000 Character: 575
还有什么方法可以实现 example
功能吗?
最佳答案
为此你需要 PL/pgSQL:
create or replace function example(x integer[])
returns table (y integer)
as
$$
begin
if length(x, 1) = 1 then
return query
select * from example_1(x[1]);
elsif length(x, 1) = 2 then
return query
select * from example_2(x[1], x[2]);
elsif length(x, 1) = 3 then
return query
select * from example_2(x[1], x[2], x[3]);
end if;
$$
language plpgsql;
请注意,访问数据库的函数的 immutable
是错误的。它应该是稳定的
具有可变数量参数的单个函数(或数组作为输入)而不是 example_1、example_2... 可能会更好。但是您的示例中没有足够的信息来确定这一点。
关于sql - 如何在 PostgreSQL 中实现 CASE 返回多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50944753/