返回

2013-02-05 43 views
2

我已经创建了如下功能基于该函数的参数,返回一组列的动态组列:返回

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' 
    ) 
    
+0

可能的重复:http://stackoverflow.com/q/11740256/939860 –

回答

0

如果所有列共享相同的类型,你可以用阵列操作。

更灵活的解决方案是使用polymorphic function,提交anyelement类型的参数,并使该函数返回相同的多态类型。这个参数可以是一个众所周知的复合类型...

这是相当先进的服务器端编程。您可以在this closely related answer中找到解释和链接的代码示例。

+0

谢谢,一旦我弄明白了,我会发布一些解决方案。 –