gpt4 book ai didi

sql - 如何在 PostgreSQL 中实现 CASE 返回多行

转载 作者:行者123 更新时间:2023-11-29 14:31:36 25 4
gpt4 key购买 nike

我有一组具有以下模式的函数:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com