Фильтровать имена столбцов из существующей таблицы для оператора SQL DDL - PullRequest
1 голос
/ 18 апреля 2020

Можно ли фильтровать имена столбцов в psql? Я хочу создать ограниченную версию исходной таблицы (с несколькими сотнями столбцов) в отдельной схеме (псевдокод):

create table why.am_i_doing_this
    select *
    from original.table 
    where column_name_of_the_table not in ('column_1', 'column_2' );

1 Ответ

1 голос
/ 18 апреля 2020

Создайте команду DDL динамически. Вы можете сделать это в два этапа:

  1. Построение оператора:

    SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
        || string_agg(column_name, ', ' ORDER BY ordinal_position)
        || ' FROM original.table'
    FROM   information_schema.columns
    WHERE  table_schema = 'original'
    AND    table_name = 'table'
    AND    column_name NOT IN ('column_1', 'column_2');
    
  2. (Проверьте, что это хорошо!) Затем выполните сгенерированный оператор в вторая поездка в оба конца на сервер.

Это основано на представлении информационной схемы information_schema.columns. В качестве альтернативы вы можете использовать pg_catalog.pg_attribute. Связанный:

Но это можно сделать за один прием на сервер тоже:

С оператором DO от любого клиента

DO - это просто оболочка для ad-ho c выполнения кода PL / pg SQL. Вы можете сделать то же самое в функции или процедуре.

DO
$$
BEGIN
   EXECUTE (
   SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
       || string_agg(column_name, ', ' ORDER BY ordinal_position)
       || ' FROM original.table'
   FROM   information_schema.columns
   WHERE  table_schema = 'original'
   AND    table_name = 'table'
   AND    column_name NOT IN ('column_1', 'column_2')
   );
END
$$;

Упростите с psql мета-командой \gexec

Поскольку вы упомянули интерактивный терминал по умолчанию psql . Там вы можете использовать \gexec. Он ...

Отправляет текущий буфер запроса на сервер, а затем обрабатывает каждый столбец каждой строки вывода запроса (если есть) как оператор SQL, который должен быть выполнен.

Итак:

SELECT 'CREATE TABLE why.am_i_doing_this AS SELECT '
    || string_agg(column_name, ', ' ORDER BY ordinal_position)
    || ' FROM original.table'
FROM   information_schema.columns
WHERE  table_schema = 'original'
AND    table_name = 'table'
AND    column_name NOT IN ('column_1', 'column_2')\gexec
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...