Postgresql函数根据单元格值返回不同的表?

时间:2013-11-26 08:50:43

标签: sql function postgresql

我有一个名为

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

我想返回functon foo_f(table_name); 所以它将从原始表AS

返回所有数据
select * FROM test1 where id IN(select row_id FROM foo_table where table_name = $1);

或者有没有办法在函数中加入它。

点是foo_table可能包含8个不同的表,每个表都有不同的布局

1 个答案:

答案 0 :(得分:0)

一般来说,我认为你的最佳选择实际上是使用where子句来执行UNION,这确保只运行一个分支。您必须提取一个结构相同的子集(就数据类型而言,但请注意您可以强制转换并命名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中你可以在这里获得LATERAL的一些里程:

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

规划师通常足够聪明,可以通过正确的索引来适当地优化这一点。