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