如何更改函数返回的列名称?

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

如何更改从以下函数返回的列名称?

执行:

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;
sql postgresql plpgsql
1个回答
1
投票

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

小提琴

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