我创建了以下函数,以基于该函数的参数返回一组列:
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')
当前,如果我需要少于4列,我必须使用“无”作为参数值,有什么方法可以避免这种情况?我认为这将通过回答上一个问题自动解决
我可以以某种方式保留输出中的数据类型吗?如果没有,我可以使用更多的数组参数吗?该函数将如下所示:
getColumns(
[textColumn1,…,textColumnN], [numericColumn1,…,numericColumnM], [dateColumn1,…,dateColumnO], [intColumn1,…,intColumnP], ‘table’ )
如果所有列共享相同的类型,则可以使用 arrays 进行操作。
更加灵活的解决方案是使用多态函数,输入一个类型的参数,anyelement并使该函数返回相同的多态类型。此参数可以是众所周知的复合类型…
anyelement