Postgresql 返回类型中的动态列名

Postgresql 返回类型中的动态列名,postgresql,postgresql-9.3,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

我有一个包含多个列的表。我想把细节还给你 通过调用函数创建表的属性。在下面,我创建了一个带有 一些记录和也创建了返回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');
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;   
插入记录

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');
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;   
注意:在函数中,我传递了一个名为
p\u columnname
的参数 我将在
cola或colb
之间传递列名

如果我传递列名
cola
,它必须像
cola colb name
一样返回结果

如果我传递列名
colb
,它必须像
colb-cola-name
一样返回结果

功能

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');
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
SELECT * FROM for_test('colb');

_cola  _colb  _name
------------------- 
 B101   A101   SAM
 B102   A102   AMC
 B103   A103   MAM
 B104   A104   KOU
--如果我传递columnname='colb',这将显示:

SELECT * FROM for_test('cola');

_cola  _colb  _name
------------------- 
 A101   B101   SAM
 A102   B102   AMC
 A103   B103   MAM
 A104   B104   KOU
SELECT * FROM for_test('colb');

_cola  _colb  _name
------------------- 
 B101   A101   SAM
 B102   A102   AMC
 B103   A103   MAM
 B104   A104   KOU
问题:如何更改
返回表类型中的列名

如果输入列从
cola
更改为
colb

您可以通过创建
类型
动态更改返回类型,如下所示

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

在类型中,您可以定义在调用函数或其他任何函数时应该出现的列名

然后用这个创建你的函数

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');

那么这个
选择_colaas _colb,_colbas _cola,_namefrom for _test('colb')@wingedparter,如果有长列列表怎么办?我应该像您使用的那样使用
列列表
还是
*
?哪个更好?