Добавить имя таблицы к каждому столбцу в наборе результатов в SQL? (Специально для Postgres) - PullRequest
9 голосов
/ 03 марта 2011

Как я могу получить метку каждого столбца в наборе результатов для добавления имени перед его таблицей?

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

Пример:

  SELECT first_name, last_name FROM person;

Я хочу, чтобы результаты были:

 | person.first_name | person.last_name |
 |-------------------|------------------|
 | Wendy             | Melvoin          |
 | Lisa              | Coleman          |

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

  SELECT first_name AS person.first_name, last_name AS person.last_name FROM person;

Причина моего вопроса в том, что я использую драйвер базы данных, который не предоставляет метаданные, информирующие меня о столбце базы данных, откуда результирующий набор получил свои данные,Я пытаюсь написать общий код для обработки результирующего набора.

Я хотел бы знать, как это сделать в SQL вообще или, по крайней мере, в Postgres конкретно.

SQLite имел такую ​​возможностьхотя я вижу это сейчас необъяснимо устарело.SQLite имеет две настройки прагмы: full_column_names & short_column_names .

Ответы [ 2 ]

19 голосов
/ 21 апреля 2012

Я знаю, что этот вопрос немного устарел, но, возможно, кто-то наткнется на ответ, и он поможет им.

Правильный способ сделать то, что вы ищете, это создать и использовать View. Да, один раз будет немного утомительно печатать все эти новые имена столбцов в качестве псевдонимов, но если есть много столбцов, вот хитрость, которую вы можете использовать, чтобы использовать метаданные PostgreSQL для записи текста представления:

select 'CREATE OR REPLACE VIEW people AS SELECT ' || 
(select string_agg(column_name || ' AS person_' || column_name, ', ')
from information_schema.columns
where table_name = 'person'
group by table_name) || 
' FROM person;';

выполнение этого приводит к:

?column?                                                 
------------------------------------------------------------------------------------------------------------- 
CREATE OR REPLACE VIEW people AS SELECT last_name AS person_last_name, first_name AS person_first_name FROM person; 

1 record(s) selected [Fetch MetaData: 0/ms] [Fetch Data: 0/ms]
[Executed: 4/21/12 2:05:21 PM EDT ] [Execution: 9/ms]

Вы можете скопировать и выполнить результаты и вуаля:

select * from people;

 person_last_name     person_first_name    
 -------------------  -------------------- 
 Melvoin              Wendy                
 Coleman              Lisa                 

 2 record(s) selected [Fetch MetaData: 1/ms] [Fetch Data: 0/ms] 
5 голосов
/ 09 января 2014

Чтобы получить VIEW ( идея Дэрила ) в одном выражении , используйте функцию или DO команда с EXECUTE:

DO
$do$
BEGIN

EXECUTE (
   SELECT format(
      'CREATE TEMP VIEW people AS SELECT %s FROM %I'
     , string_agg(format('%I AS %I', attname, attrelid::regclass || '.' || attname), ', ')
     , attrelid::regclass)
   FROM   pg_attribute
   WHERE  attrelid = 'person'::regclass  -- supply source table name once
   AND    attnum > 0
   AND    NOT attisdropped
   GROUP  BY attrelid
   );

END
$do$;

Это немедленно выполняет команду вида:

CREATE OR REPLACE VIEW people AS
SELECT person_id AS "person.person_id"
     , first_name AS "person.first_name"
     , last_name AS "person.last_name"
FROM   person;

Было бы меньше проблем с объединением имен допустимых столбцов с '_' вместо '.'.Но вы должны быть готовы к нестандартным именам, которые в любом случае требуют двойных кавычек (и защищаются от возможного внедрения SQL).

При желании вы можете указать имя таблицы, дополненное схемой (myschema.person).Имя схемы автоматически добавляется в имена столбцов, если оно находится за пределами текущего search_path.

. При повторном использовании вы оборачиваете это в функцию plpgsql и делаете имя таблицы a text параметр.Все преобразования текста в код очищены здесь, чтобы предотвратить внедрение SQL.Пример с дополнительной информацией здесь:

И вы можете использовать новый to_regclass() в Postgres 9.4+:

...