我有一个products
架构和一些表格
products
架构中的每个表都有一个id
,按此id
我可以获得此表名称,例如
products
\ product1
\ product2
\ product3
我需要从动态访问相应产品中选择信息,例如
SELECT * FROM 'products.'(SELECT id from categories WHERE id = 7);
当然,这不起作用...
我如何在PostgreSQL中做类似的事情?
答案 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