返回

2013-02-05 45 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

謝謝,一旦我弄明白了,我會發布一些解決方案。 –