PostgreSQL. Обратиться к таблице не зная ее имени напрямую

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

В нете не смог найти ничего подобного. Заранее спасибо)

Чуть подробнее: TABLE1 содержит сотни записей. Каждая запись имеет имя таблицы, к которой она относится. Таблиц гораздо меньше и их имена мы получаем при помощи запроса:

SELECT DISTINCT TABLENAME FROM TABLE1;

В результате получаем таблицу, в каждой строчке которой лежит имя таблицы. После этого, мне нужно создать таблицу, которая бы в 1-ом столбце писала имя таблицы из TABLE1, а во 2-ом количество записей в этой таблице.


Ответы (1 шт):

Автор решения: Sergey Gershkovich

Можно генерировать произвольный запрос в текстовом виде и получать содержимое любой таблицы. Вопрос только, какой запрос в итоге должен получиться. Динамический запрос можно выполнить так:

Есть такие операторы: - PREPARE, EXECUTE и execute из PL/pgSQL.

-- Собираешь произвольный запрос в текстовой форме
-- Добавляешь к нему 'PREPARE my_plan AS ', где my_plan - имя запроса
-- Запускаешь подготовленную команду через процедурный execute
-- В конце, запускаешь EXECUTE с указанным ранее именем запроса 


DO $$
DECLARE _sql varchar;
BEGIN -- Тут опиши свой запрос
    _sql = COALESCE((SELECT string_agg(DISTINCT
                             'SELECT
                                '||quote_literal(TABLENAME)||' AS name
                                , (SELECT count(*) FROM '||quote_ident(TABLENAME)||') AS countt'                                  
                             ,' UNION ') 
                     FROM TABLE1
                     ),'SELECT '||quote_literal('Нет данных')||' AS name, 0 AS countt'); 
    _sql = 'PREPARE my_plan AS ' || _sql;

    BEGIN
        execute _sql;
    EXCEPTION
        WHEN DUPLICATE_PREPARED_STATEMENT THEN 
            _sql='DEALLOCATE my_plan; '||_sql;
            execute _sql;
    END;

END $$;

EXECUTE my_plan;

Код DO $$ ... END $$ можно обернуть в хранимую процедуру, в которую передавать сгенерированный запрос в виде параметра и вызывать его для каждой таблицы из TABLE1.

→ Ссылка