如何更改从以下函数返回的列名称?
执行:
select * from get_parameterbased_return_Table('condition2');
列名称应更改为
(col3 text, col4 text)
示例表和函数:
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)
, ('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 |
这也返回原始数据类型。您真的可以在这里归还任何东西。
再次强调,您必须在通话中提供信息。保留原始函数,您可以在调用中使用列别名:
SELECT * FROM public.get_parameterbased_return_table('condition2') AS t(col3, col4);
col3 | col4 |
---|---|
11 | 22 |
14 | 545 |