2013-11-26 54 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

策劃者通常是聰明足以正確優化這個假設適當的索引。

相關問題