2013-11-26 5 views
0

나는 테이블이Postgresql 함수는 셀 값에 따라 다른 테이블을 반환합니까?

내가 functon의 foo_f (TABLE_NAME)을 반환 할
foo_table(id, table_name, row_id); values (1, test1, 3), (2, test1, 4), (3, test2, 2); 

라고있다; 는 그래서

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

AS 기원 테이블의 모든 데이터를 반환하거나 함수 내부를 가입하는 방법이있다.

점이 foo_table 8 개 다른 테이블을 포함 할 수 있으며, everytable가 다른 레이아웃 일반적으로

+0

동적 쿼리를 작성하려고합니까? 어떤 경우에는 plpgsql의 EXECUTE (http://www.postgresql.org/docs/current/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN)를보고 싶습니다. –

+0

다음과 같은 행을 반환하고 싶습니다. 특별하지 않아. 의미, 열 유형 또는 이름을 미리 정의하고 싶지 않습니다. 1 spesific 테이블 집합을 반환하고 싶습니다 및 foo_table 및 모든 row_id에서 그 테이블 이름을 얻을 것이다. – kasu

답변

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에서 당신이 측면 여기서 약간의 마일리지를 얻을 수 있습니다 :

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

를 사용하는 플래너는 일반적으로 스마트 적절한 색인 생성을 가정 할 때이를 적절하게 최적화 할만큼 충분합니다.

관련 문제