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

标签 sql postgresql function case

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

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/

相关文章:

database - 复制 PostgreSQL 数据以进行分析

postgresql - 解释一下postgres查询,为什么用WHERE和LIMIT查询那么长

language-agnostic - 缓慢变化的实值函数的在线逼近算法

mysql - 将现有数据 varchar 和列转换为 DATE

mysql - SQL查询搜索删除字符串的结尾

sql - 从一个表中获取一组 ID,并使用它们在不同的表中生成一行

sql - 如何使用 T-SQL "pick"随机记录

javascript - AWS Lambda postgres 连接超时,但仅在第一次尝试时

javascript - 使用 codemirror 编辑调用函数

sql - 从任意 %ROWTYPE 或 RECORD 值获取表名