我创建了以下函数以根据该函数的参数返回一组列:

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

最佳答案

如果所有列共享同一类型,则可以使用数组进行操作。
一个更灵活的解决方案是使用polymorphic function,输入一个类型anyelement的参数,并使函数返回相同的多态类型。此参数可以是众所周知的复合类型。。。
这是相当高级的服务器端编程。您可以在this closely related answer中找到这两种方法的代码示例以及解释和链接。

关于sql - 返回动态列集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14711045/

10-11 02:53
查看更多