2013-05-20 2 views
1

FROM 절에서 레코드를 두 번 이상 반환하는 함수를 호출하려면 어떻게해야합니까? 레코드를 반환하는 함수를 사용할 때 '열 정의 목록'을 지정해야한다는 것을 이해합니다. 그런데 어떻게 함수에 별칭을 사용할 수 있습니까?PostgreSQL : FROM 절에서 함수를 두 번 이상 호출하십시오.

예 :

ERROR: table name "foo" specified more than once 

내가 열 정의 목록을 계속 사용하려는 기능 내가 마지막에 가지고에 사용할 때문에, 다음과 함께

CREATE OR REPLACE FUNCTION foo(which_foo int) RETURNS SETOF RECORD AS 
$BODY$BEGIN 
IF which_foo=0 THEN 
RETURN QUERY EXECUTE 'SELECT 1::int,2::int;'; 
ELSE 
RETURN QUERY EXECUTE 'SELECT 1::int,2::int;'; 
END IF; 
END$BODY$ 
LANGUAGE plpgsql; 

SELECT * FROM foo(0) AS (a int, b int);; 
SELECT * FROM foo(1) AS (c int, d int); 
SELECT * FROM foo(0) AS (a int, b int), foo(1) AS (c int, d int); 

마지막 선택 문이 실패합니다 가능한 한 포괄적이어야한다.

답변

2
SELECT f0.*, f1.* 
FROM 
    foo(0) AS f0 (a int, b int), 
    foo(1) AS f1 (c int, d int); 
+0

아;) 감사합니다! – user2402456

0

는 내가 기록을 반환하는 함수를 사용하여 '열 정의 목록' 지정할 필요가 있음을 이해합니다.

아니요. 나는 익명의 기록으로 일하지 않을 것이다. Declare the return type, 당신이 이미 그것을 알고 있기 때문에 :

CREATE OR REPLACE FUNCTION foo(which_foo int) 
RETURNS TABLE (a int, b int) AS 
$func$ 
BEGIN 
    IF which_foo = 0 THEN 
     RETURN QUERY SELECT 1,2; 
    ELSE 
     RETURN QUERY SELECT 1,2; 
    END IF; 
END 
$func$ LANGUAGE plpgsql;

을 그리고 당신은 한 행에 여러 통화를 결합하고 싶지 않은 가정, 당신은 UNION ALL 사용해야합니다

SELECT * FROM foo(0) 
UNION ALL 
SELECT * FROM foo(1); 
관련 문제