如何更改postgres函数中的返回表列名称

问题描述 投票:0回答:1

如何更改下面函数中的返回表列名称。

什么时候

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;


postgresql
1个回答
0
投票

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.