Как автоматически переименовать имена столбцов в SELECT a. *, B. *, Чтобы иметь ie. префиксы a_ и b_ в именах столбцов результата? - PullRequest
5 голосов
/ 25 марта 2020

У меня есть две таблицы (a, b) или объединяющая их таблица с одинаковыми именами столбцов. (Таблица (таблицы) широкая, имеет около ста столбцов.)

Использование:

SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;

... работает, но теперь, если я хочу сделать из него представление:

CREATE OR REPLACE VIEW v_test_ab AS
SELECT a.*, b.*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;

... он не может создать представление, потому что будет несколько столбцов с одинаковым именем.

В PostgreSQL, есть ли способ автоматически переименовать столбец имена таблицы результатов с использованием заданного шаблона?

Пример примерно такой:

CREATE OR REPLACE VIEW v_test_ab AS
SELECT a.* AS a_*, b.* AS b_*
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;

Или, возможно, что-то вроде:

SELECT a.* AS generate_column_names('a_%', a.*)
      , b.* AS generate_column_names('b_%', b.*)

Избегать необходимости писать :

CREATE OR REPLACE VIEW v_test_ab AS
SELECT 
    a.id as a_id, a.date1 as a_date1, a.date2 as a_date2 -- and so on 
    , b.id as b_id, b.date1 as b_date1, b.date2 as b_date2 -- and so on
FROM a LEFT JOIN b ON b.id=a.id AND b.date1=a.date2;

Конечно, я могу использовать поиск и замену шаблонов в IDE-редакторе, но конечный результат выглядит раздутым. (Реальный случай, который у меня есть, имеет четыре широкие исходные таблицы с множеством одинаковых имен столбцов.)

1 Ответ

4 голосов
/ 25 марта 2020

Хотя можно создать запрос на создание в операторе execute, присоединившись к каталогу для извлечения имен таблиц и столбцов, будет трудно читать.

Вместо этого самый простой и быстрый Можно было бы автоматически построить список столбцов и скопировать его - вставьте в свой запрос.

В качестве бонуса, в тот день, когда кто-то просит переименовать / изменить / удалить определенный столбец c, появляется письменная запись его использования.

SELECT table_name || '.' || column_name || ' as a_' || column_name || ', ' 
FROM information_schema.columns 
WHERE table_schema = 'my_schema' 
  AND table_name= 'my_tablename';

         ?column?
-------------------------
 my_tablename.id as a_id,
 my_tablename.title as a_title,
 my_tablename.a as a_a,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...