2011-04-24 78 views
2

我有一个products架构和一些表。
products模式中的每个表都有一个id,并且由此id我可以得到这个表名,例如,PostgreSQL动态表访问

products 
    \ product1 
    \ product2 
    \ product3 

我需要选择适当的产品,例如动态访问信息

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

当然,这也不行...
我怎样才能做这样的事情在PostgreSQL的?

+4

那些不应该摆在首位单独的表。将它们全部放在同一个表中,为ID添加一列,然后按该ID进行选择。 – tdammers 2011-04-24 19:39:29

+0

我同意tdammers。这是一个糟糕的数据库设计 – 2011-04-24 19:41:00

回答

3

OK,我发现了一个解决方案:

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

+0

你好,亚历克斯我试过这个,但我在一列获得记录,并用逗号分隔值。我想用表格格式,所以你可以帮我解决这个问题。提前致谢。 – Anvesh 2013-06-06 05:12:33

2

如果你可以改变你的数据库布局来使用partitioning来代替,那可能是一条路。然后,您可以像访问一个表而不是多个子表一样访问“主”表。

您可以创建一个视图,将这些表格与对应于该表格的额外列相结合。如果您的所有查询都为此额外列指定了一个值,那么规划人员应该足够聪明,可以跳过扫描其余所有表。

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