Добавить имя таблицы к каждому столбцу в результирующем наборе в SQL? (В частности, Postgres)

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

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

пример:

  SELECT first_name, last_name FROM person;

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

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

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

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

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

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

У SQLite была такая функция, хотя я вижу, что теперь она необъяснимо устарела. SQLite имеет два параметра pragma:full_column_names & short_column_names.

2 ответов


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

правильный способ сделать то, что вы ищете, чтобы создавать и использовать представления. Да, будет немного утомительно однократно вводить все эти новые имена столбцов в качестве псевдонимов, но если есть много столбцов, вот трюк, который вы можете использовать для использования метаданных 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] 

для получения 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 и сделайте имя таблицы