我已经创建了以下函数来根据该函数的参数返回一组列:
CREATE OR REPLACE FUNCTION getColumns(IN _column1 text, IN _column2 text, IN _column3 text, IN _column4 text, IN _table text)
RETURNS TABLE(cmf1 text, cmf2 text, cmf3 text, cmf4 text) AS
$BODY$
BEGIN
RETURN QUERY EXECUTE
'SELECT '
|| case when _column1 = 'None' then quote_literal('None') else quote_ident(_column1) end || '::text as cmf1,'
|| case when _column2 = 'None' then quote_literal('None') else quote_ident(_column2) end || '::text as cmf2,'
|| case when _column3 = 'None' then quote_literal('None') else quote_ident(_column3) end || '::text as cmf3,'
|| case when _column3 = 'None' then quote_literal('None') else quote_ident(_column3) end || '::text as cmf4'
' FROM '
|| _table;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
使用样本表:
CREATE TABLE test20130205
(
a text,
b text,
c character varying,
d text
);
我可以通过以下方式使用该功能:
select * from getColumns('a','b','c','d','test20130205');
我确实有以下问题:
如何扩展此功能以将任意数量的列作为输入(目前我限制为4),例如:
getColumns([textColumn1,...,textColumnN],'table')
目前我必须使用'None'作为参数值,以防我需要少于4列,有没有办法如何避免这种情况?我认为这将通过回答上一个问题
我可以以某种方式保留输出中的数据类型吗?如果没有,我可以使用更多的数组参数吗?该函数将如下所示:
getColumns(
[textColumn1,...,textColumnN],
[numericColumn1,...,numericColumnM],
[dateColumn1,...,dateColumnO],
[intColumn1,...,intColumnP],
'table'
)
答案 0 :(得分:0)
如果所有列共享相同类型,则可以使用 arrays 进行操作。
更灵活的解决方案是使用polymorphic function,输入类型为anyelement
的参数,并使函数返回相同的多态类型。此参数可以是众所周知的复合类型......
这是相当高级的服务器端编程。您可以在this closely related answer中找到两种方法的代码示例以及解释和链接。