Вернуть динамический набор столбцов

Я создал следующую функцию для возврата набора столбцов на основе параметров этой функции:

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

person Tomas Greif    schedule 05.02.2013    source источник
comment
Возможный дубликат: stackoverflow.com/q/11740256/939860   -  person Erwin Brandstetter    schedule 05.02.2013


Ответы (1)


Если все столбцы имеют один и тот же тип, вы можете работать с массивами.

Более гибким решением было бы использование полиморфная функция, передать параметр типа anyelement и заставить функцию возвращать тот же полиморфный тип. Этот параметр может быть известного составного типа...

Это довольно продвинутое серверное программирование. Вы можете найти примеры кода для обоих подходов с пояснениями и ссылками в этом тесно связанном ответе.

person Erwin Brandstetter    schedule 05.02.2013
comment
Спасибо, я опубликую какое-нибудь решение, как только выясню это. - person Tomas Greif; 06.02.2013