如何在 postgres 函数中使用 CASE 来 return Select 语句?

How to use CASE in postgres function to return Select statement?

我正在尝试编写一个函数,其参数应该是 return 两个 SELECT 之一,具体取决于此函数的参数:

CREATE FUNCTION fx(m integer)
RETURNS SETOF AS $$
BEGIN
    CASE m
        WHEN 1 then return query select * from pg_catalog.pg_roles
        WHEN 2 then return query select * from pg_catalog.pg_auth_members
    END
END
$$ LANGUAGE plpgsql;

SELECT fx(1);

抱歉,我是 sql 函数的新手,所以我究竟做错了什么? 执行时出现此错误:

"SQL 错误 [42883]:错误:function fx(integer) 不存在 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换

谢谢!

如果我有不同的表 return 根据函数参数,你如何 指定列? 不能。函数必须始终具有相同的 return 类型,并且必须在函数定义中声明确切的 return。
你可以 sort-of 通过让你的函数 return 成为一个 refcursor 来得到你想要的东西;请参阅 Cursors 43.7.3.5(或适合您 Postgres 版本的部分),例如:

create or replace function confused_function( What_to_do integer) 
  returns refcursor
 language plpgsql
as $$
declare 
  rec  refcursor; 
begin 
    case when What_to_do  = 1 then 
              open rec for select * from t1; 
             
         when What_to_do  = 2 then
              open rec for select * from t2; 
         
        else 
             raise exception 'Invalid What_to_do parameter value specified (%)', What_to_do
                using Hint = 'Value for Parameter: What_to_do must be 1 or 2'; 
    end case; 

    return rec; 
end;
$$;

然而,这会将游标处理转移到调用例程。您最好编写 2 个函数(每个 SQL 一个)。让调用例程分析 'parameter' 并调用适当的函数(或者只是 运行 和 SQL 而没有中间函数)。

一点开发哲学:一个函数应该做一件事,做好它,并且知道它需要完成它的一切。你的函数不知道该做什么;需要告诉它。