返回类型中的动态列名称

时间:2015-01-20 05:16:45

标签: postgresql postgresql-9.3

我有一个包含多列的表。我想回复一下细节 通过调用函数的表。在下面我创建了表 一些记录并且还创建了返回select结果的函数 言。

表格

create table for_test
(
cola varchar(10),
colb varchar(10),
name varchar(20),
address varchar(50)
);

插入记录

insert into for_test values('A101','B101','SAM','Munich');
insert into for_test values('A102','B102','AMC','Belgium');
insert into for_test values('A103','B103','MAM','Shanghai');
insert into for_test values('A104','B104','KOU','Dhaka');

注意:在函数中,我传递了一个名为p_columnname的参数 我将在cola or colb之间传递列名。

如果我传递了列名cola,则必须返回cola colb name之类的结果。

如果我传递了列名colb,则必须返回colb cola name之类的结果。

功能

create or replace function for_test
(
    p_columnname varchar(20)
)

RETURNS TABLE
(
    _cola varchar(10),
    _colb varchar(10),
    _name varchar(20)
) AS
$$

DECLARE 
    v_details varchar;
    v_query varchar;
BEGIN
    IF p_columnname = 'cola' THEN

        v_details := 'cola,colb,name';

    ELSIF p_columnname = 'colb' THEN

        v_details := 'colb,cola,name';

    ELSE
        v_details := 'cola,colb,name';

    END IF;

    v_query := 'SELECT '|| v_details ||' from for_test';

    RAISE INFO '%',v_query;

    RETURN QUERY EXECUTE v_query;

END;

$$

LANGUAGE PLPGSQL;   

- 如果我通过columnname =' cola'这将显示:

SELECT * FROM for_test('cola');

_cola  _colb  _name
------------------- 
 A101   B101   SAM
 A102   B102   AMC
 A103   B103   MAM
 A104   B104   KOU

- 如果我通过columnname =' colb'这将显示:

SELECT * FROM for_test('colb');

_cola  _colb  _name
------------------- 
 B101   A101   SAM
 B102   A102   AMC
 B103   A103   MAM
 B104   A104   KOU

问题:如何更改RETURN TABLE TYPE中的列名称  如果输入列从cola更改为colb

1 个答案:

答案 0 :(得分:1)

您可以通过创建type(如下所示)来动态更改返回类型

create type colb_a as (colb varchar(10), --_colb comes first
    _cola varchar(10),
    _name varchar(20))

create type cola_b as (cola varchar(10), -- _cola Comes first
    _colb varchar(10),
    _name varchar(20))

TYPE 中,您可以定义调用函数时应该出现的列名称

并使用此

创建您的功能
create or replace function for_test
(
    _retType anyelement,p_columnname varchar(20)
)

RETURNS  setof anyelement AS


 ...
 ...

LANGUAGE PLPGSQL; 

所以你需要像这样调用函数:

select * from for_test(NULL::cola_b,'cola');

select * from for_test(NULL::colb_a,'colb');