如何更改下面函数中的返回表列名称。
什么时候
select * from get_parameterbased_return_Table('condition2');
查询执行返回表名应该更改(col3文本,col4文本)
表格及功能
CREATE TABLE public.parameterbased_return_table (
col1 text NULL,
col2 text NULL,
col3 int4 NULL,
col4 int4 NULL
);
INSERT INTO public.parameterbased_return_table
(col1, col2, col3, col4)
VALUES('A', 'B', 11, 22);
INSERT INTO public.parameterbased_return_table
(col1, col2, col3, col4)
VALUES('dfdf', 'dfe', 14, 545);
CREATE OR REPLACE FUNCTION get_parameterbased_return_Table(condition TEXT)
RETURNS TABLE (col1 text, col2 text) AS
$$
BEGIN
IF condition = 'condition1' THEN
RETURN QUERY SELECT t.col1::text, t.col2::text FROM parameterbased_return_Table t;
ELSIF condition = 'condition2' THEN
RETURN QUERY SELECT t.col3::text, t.col4::text FROM parameterbased_return_Table t;
ELSE
-- Handle other conditions or return an empty result set
RETURN QUERY SELECT NULL::record;
END IF;
END;
$$
LANGUAGE plpgsql;
Postgres(像 SQL)是严格类型的。函数无法动态更改其返回类型 - 包括返回行类型的函数的列数、名称和类型。
多态函数有一个有限的解决方法,其中返回类型由给定的输入确定。技巧是将实际的返回类型传递给函数。参见:
仅对奇异的用例有意义。
也就是说,这就是你如何完成这样的特技:
-- create desired return types
CREATE TYPE public.result1 AS (col1 text, col2 text);
CREATE TYPE public.result2 AS (col2 int, col3 int);
-- create polymorphis function
CREATE OR REPLACE FUNCTION public.get_parameterbased_return_table1(_return_type anyelement)
RETURNS SETOF anyelement
LANGUAGE plpgsql AS
$func$
BEGIN
CASE pg_typeof(_return_type)
WHEN 'public.result1'::regtype THEN
RETURN QUERY
SELECT t.col1, t.col2
FROM parameterbased_return_table t;
WHEN 'public.result2'::regtype THEN
RETURN QUERY
SELECT t.col3, t.col4 -- returning actual int values
FROM parameterbased_return_table t;
ELSE
-- Handle other conditions or return an empty result set
-- just don't return anything (simpler)
END CASE;
END
$func$;
致电:
SELECT * FROM public.get_parameterbased_return_table1(null::public.result1);
col1 | col2 |
---|---|
A | B |
dfdf | dfe |
SELECT * FROM public.get_parameterbased_return_table1(null::public.result2);
col3 | col4 |
---|---|
11 | 22 |
14 | 545 |