2013-11-26 57 views
0

我有一个表称为Postgresql函数根据单元格值返回不同的表?

foo_table(id, table_name, row_id); values (1, test1, 3), (2, test1, 4), (3, test2, 2); 

我想回到functon foo_f(表名); 所以它会返回原籍表中的所有数据AS

select * FROM test1 where id IN(select row_id FROM foo_table where table_name = $1); 

或者是有没有办法参加这一个函数内部。

点为foo_table可能包含8个不同的表和everytable有不同的布局

+0

您是否正在尝试构建动态查询。在这种情况下,您想查看plpgsql的EXECUTE(http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN) –

+0

我想返回具有没有特别的。意思是,我不想预先定义列类型或名称。我想返回1个特定的表集,我会从foo_table和它的所有row_id中获取表名。 – kasu

回答

0

在一般情况下,我觉得你最好的选择实际上是做一个UNION以确保只有一个分支获取运行where子句。你将不得不拉一个相同的结构化子集(就数据类型而言,但是请注意,你可以投射和命名NULL值)。计划者非常聪明,只会执行计划的相关部分。例如,考虑这个:

CREATE OR REPLACE FUNCTION journals() 
RETURNS setof .... LANGUAGE SQL AS $$; 
SELECT jl.*, j.reference, j.description, j.counterparty 
    FROM journal_line jl 
    JOIN journals js ON jl.entry_id = js.id 
    JOIN (select id, reference, description, null::text as counterparty, 
       'general' as type 
      FROM general_journal 
      UNION 
     select id, invnumber, description, counterparty, 'sales' 
      FROM sales_journal) j ON (j.type, j.id) = (js.type, js.id); 
$$; 

现在的9.3,你可以得到一些里程离开这里横向:

CREATE OR REPLACE FUNCTION journals() 
RETURNS setof .... LANGUAGE SQL AS $$; 
SELECT jl.*, j.reference, j.description, j.counterparty 
    FROM journal_line jl 
    JOIN journals js ON jl.entry_id = js.id 
    JOIN (select id, reference, description, null::text as counterparty 
      FROM general_journal 
      WHERE js.type = 'general' 
      UNION 
     select id, invnumber, description, counterparty 
      FROM sales_journal 
      WHERE js.type = 'sales') j ON j.id = js.id 
$$; 

如果不行,用EXECUTE ... USING

策划者通常是聪明足以正确优化这个假设适当的索引。

相关问题