【问题标题】:Return dynamic set of columns返回动态列集
【发布时间】:2013-02-05 15:30:29
【问题描述】:

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

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

【问题讨论】:

标签: sql postgresql plpgsql dynamic-sql


【解决方案1】:

如果所有列共享相同的类型,您可以使用数组

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

这是相当高级的服务器端编程。您可以在this closely related answer 中找到这两种方法的代码示例以及解释和链接。

【讨论】:

  • 谢谢,等我弄明白了,我会发布一些解决方案。
猜你喜欢
  • 2022-06-16
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 2019-04-04
  • 2021-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多