Доступ к динамическим таблицам в PostgreSQL - PullRequest
2 голосов
/ 24 апреля 2011

У меня есть products схема и несколько таблиц там.
Каждая таблица в products схеме имеет id, и по этому id я могу получить это имя таблицы, например,

products
    \ product1
    \ product2
    \ product3

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

SELECT * FROM 'products.'(SELECT id from categories WHERE id = 7);

Конечно, это не работает ...
Как я могу сделать что-то подобное в PostgreSQL?

Ответы [ 3 ]

3 голосов
/ 25 апреля 2011

ОК, я нашел решение:

CREATE OR REPLACE FUNCTION getProductById(cid int) RETURNS RECORD AS $$
    DECLARE
    result RECORD;

    BEGIN
        EXECUTE 'SELECT * FROM ' || (SELECT ('products.' || (select category_name from category where category_id = cid) || '_view')::regclass) INTO result;

        RETURN result;
    END;
$$ LANGUAGE plpgsql;

и для выбора:

SELECT * FROM getProductById(7) AS b (category_id int, ... );

работает для PostgreSQL 9.x

2 голосов
/ 24 апреля 2011

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

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

Или вы можете написать функцию в PL / pgSQL , используя команду EXECUTE для создания соответствующего запроса после извлечения имени таблицы. Функция может даже возвращать набор , поэтому она может быть использована в предложении FROM так же, как и в случае ссылки на таблицу. Или вы можете просто сделать такую ​​же конструкцию запроса в логике приложения.

0 голосов
/ 08 мая 2011

Для меня это звучит так, как будто у вас есть серьезная проблема при разработке схемы: разве у вас не должно быть только одной таблицы продуктов с категорией_идентификатора?

Можете ли вы поддерживать веб-сайт, упомянутый в этой статье?

http://thedailywtf.com/Articles/Confessions-The-Shopping-Cart.aspx

...