2013-06-27 5 views
2

У меня есть несколько таблиц в моей базе данных. Все они имеют одинаковые столбцы (id, name), но отличаются именем таблицы. Эти таблицы имеют имена, начинающиеся с буквы «h».
Не очень интересный дизайн схемы, но я должен следовать за ней.
Мне нужно найти идентификатор во всех этих таблицах.Запрос на подзапрос, который получает имена таблиц

Я пытался что-то похожее на:

select id from (select table_name 
FROM information_schema.tables 
where table_name like 'h%') as t; 

Я получил сообщение об ошибке:

ERROR: column "id" does not exist. 

Я понимаю ошибку сейчас, но я до сих пор не знаю, как сделать запрос?

ответ

3

Для этого вам нужен динамический SQL, поскольку вы не можете использовать значения как идентификаторы в простом SQL. Написать функцию PL/PgSQL с EXECUTE:

CREATE FUNCTION f_all_tables() 
    RETURNS TABLE (id int) AS 
$func$ 
DECLARE 
    _tbl regclass; 
BEGIN 

FOR _tbl IN 
    SELECT c.oid::regclass 
    FROM pg_catalog.pg_class c 
    JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace 
    WHERE c.relkind = 'r' 
    AND c.relname LIKE 'h%' 
    AND n.nspname = 'public' -- your schema name here 
LOOP 
    RETURN QUERY EXECUTE ' 
    SELECT id FROM ' || _tbl; 
END LOOP; 

END 
$func$ LANGUAGE plpgsql; 

Я использую переменную объектного типа идентификатора regclass для эффективного предотвращения инъекции SQL. Подробнее о том, что в этом связанном с ответом:
Table name as a PostgreSQL function parameter

+0

Благодаря @Erwin Brandstetter – sweety

+0

@sweety: Обратите внимание на фиксированные опечатки. –