Postgresql 返回类型中的动态列名
我有一个包含多个列的表。我想把细节还给你 通过调用函数创建表的属性。在下面,我创建了一个带有 一些记录和也创建了返回select结果的函数 声明 表格: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
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,如果有长列列表怎么办?我应该像您使用的那样使用列列表
还是*
?哪个更好?