Динамический выбор столбца PostgreSQL

#postgresql-9.4

#postgresql-9.4

Вопрос:

Я немного затрудняюсь с некоторыми динамическими postgresql: у меня есть таблица с именем «list_columns», содержащая список имен столбцов с «column_name» в качестве имени переменной; эти имена столбцов взяты из входной таблицы с именем «input_table».

[список столбцов]

имя_столбца
col_name_a
col_name_b
col_name_c…

[входная таблица]

col_name_a col_name_b col_name_c col_name_d имя столбца col_name_e имя столбца
значение_а_1 value_b_1 значение_c_1 value_d_1 значение_е_1
значение_а_2 value_b_2 value_c_2 value_d_2 значение_е_2

Что я хотел бы сделать, это динамически создать новую таблицу, используя этот список, что-то вроде этого:

 create table output_table as
select (select distinct(column_name) seperated by "," from list_columns) from input_table;
 

Результирующая таблица будет иметь
вид [output_table]

col_name_a col_name_b col_name_c
значение_а_1 value_b_1 значение_c_1
значение_а_2 value_b_2 value_c_2

Я видел, что мне следует использовать некоторые процедуры выполнения, но я не могу понять, как это сделать.

Примечание: Я знаю, что мог бы напрямую выбрать 3 столбца; Я упростил дело.

Если кто-нибудь будет достаточно любезен, чтобы помочь мне в этом,

Спасибо, с уважением, Джонатан

Комментарии:

1. Не имеет отношения к вашей проблеме, но: Postgres 9.4 больше не поддерживается , вам следует запланировать обновление как можно скорее.

Ответ №1:

Для этого вам нужен динамический SQL, а для этого вам нужен PL / pgSQL.

Вам нужно собрать CREATE TABLE инструкцию на основе input_table , а затем запустить сгенерированный SQL.

 do
$
declare
  l_columns text;
  l_sql text;
begin
  -- this generates the list of columns
  select string_agg(distinct column_name, ',')
    into l_columns
  from list_table;

  -- this generates the actual CREATE TABLE statement using the columns
  -- from the previous step
  l_sql := 'create table output_table as select '||l_columns||' from input_table';

  -- this runs the generated SQL, thus creating the output table.
  execute l_sql;
end;
$;
 

Если вам это очень нужно, вы можете поместить это в хранимую функцию (ваша неподдерживаемая версия Postgres не поддерживает реальные процедуры).

Комментарии:

1. Большое вам спасибо! Он отлично работает!