PostgreSQL动态表访问

时间:2011-04-24 19:26:42

标签: sql database postgresql plpgsql dynamic-sql

我有一个products架构和一些表格 products架构中的每个表都有一个id,按此id我可以获得此表名称,例如

products
    \ product1
    \ product2
    \ product3

我需要从动态访问相应产品中选择信息,例如

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

当然,这不起作用...
我如何在PostgreSQL中做类似的事情?

3 个答案:

答案 0 :(得分:3)

好的,我找到了解决方案:

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

答案 1 :(得分:2)

如果您可以将数据库布局更改为使用partitioning,那么可能就是这样。然后你可以只访问“master”表,好像它是一个表而不是多个子表。

您可以创建一个视图,该视图将表与一个与其表相对应的额外列组合在一起。如果您的所有查询都为此额外列指定了值,则规划器应足够智能,以便跳过扫描所有其余表。

或者你可以在PL/pgSQL中编写一个函数,使用EXECUTE命令在获取表名后构造适当的查询。该函数甚至可以return a set,因此它可以像在表引用中一样在FROM子句中使用。或者您可以在应用程序逻辑中执行相同的查询构造。

答案 2 :(得分:0)

对我来说,这听起来像是一个主要的架构设计问题:你不应该只有一个带有category_id的产品表吗?

您是否可以维护本文中提到的网站?

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