PostgreSQL:如何在函数的 CASE 表达式中仅显示单个表的选定列



示例:我正在传递两个参数来函数,即n(案例编号)和tname(表名),并希望相应地显示行。

-

-表"测试"

create table testing
(
  rollno integer,
  fname text,
  lname text,
  age integer,
  branch text,
  phno integer,
  email text,
  address text,
  city text,
  state text,
  country text
)
-

-行插入

insert into testing values(1,'aaa','bbb',25,'CS',1234567890,'abc@gmail.com','sector1','xyz','zyx','yxz');
insert into testing values(2,'zzz','xxx',25,'EE',987654321,'zzz@gmail.com','sector2','uvw','wvu','vuw');
-

-函数 "f1()"

create or replace function f1(n integer,tname varchar)/*n for case number and tname for table name */
returns setof tname as 
$body$
begin
     case n
     when 1 then
     return query execute format ($$ select rollno,fname from %I $$,tname);
     when 2 then 
     return query execute format ($$ select lname,age,branch from %I $$,tname);
     when 3 then
     return query execute format ($$ select phno,email,address,city,country from %I $$,tname);
     end case;
end
$body$
language plpgsql;
-

-函数调用

select * from f1(1,'testing');
/*Show only case "1" select query result*/
select * from f1(2,'testing');
/*Show only case "2" select query result*/
select * from f1(3,'testing');
/*Show only case "3" select query result*/

虽然 Craig 是正确的,返回类型在函数声明中不能是动态的,但多态类型有一种方法可以解决这个问题。这非常简单,实际上可以完美地工作:

CREATE OR REPLACE FUNCTION data_of(_tbl_type anyelement)
  RETURNS SETOF anyelement AS
$func$
BEGIN
RETURN QUERY EXECUTE 'SELECT * FROM '|| pg_typeof(_tbl_type);
END
$func$ LANGUAGE plpgsql;

呼叫(重要!

SELECT rollno,fname FROM data_of(NULL::testing);
SELECT * FROM data_of(NULL::my_schema.my_table);
SELECT * FROM data_of(NULL::my_custom_type);

您需要的是一个众所周知的类型。对于每个表,都有一个自动的已知类型。但是你可以创建任何类型,NULL强制转换为它并将其传递给函数。通过这种方式,您可以准确地构建您的问题中的内容......

相关答案有更多细节
重构 PL/pgSQL 函数以返回各种 SELECT 查询的输出

最新更新