1

PostgreSQL 9.2를 사용하여 하나의 인수를 취하여 다중 열 테이블을 반환하는 함수를 정의했습니다. 이 함수를 CTE의 행에있는 여러 인수에 적용하고 싶습니다. 내가 얻는 결과는 하나의 튜플 열입니다. 원하는 여러 열은 아닙니다. 재치에 :레코드 유형 단일 열에서 값 분할/추출 사용자 정의 함수를 복수 행 CTE에 적용

SELECT myfunc(arg) FROM rows; 
SELECT * FROM (select myfunc(arg) FROM rows) x; 

을 그리고 모든 실패 다음 세 가지 (CTE :

sandbox=# CREATE FUNCTION myfunc(arg int) RETURNS table(col1 int, col2 int) AS 
sandbox-# 'SELECT arg+1, arg+2' 
sandbox-# LANGUAGE SQL; 
CREATE FUNCTION 
sandbox=# select * from myfunc(1); 
col1 | col2 
------+------ 
    2 | 3 
(1 row) 

sandbox=# WITH rows AS (
sandbox(# SELECT 1 AS arg UNION SELECT 2 AS arg 
sandbox(#) 
sandbox-# SELECT * FROM (SELECT myfunc(arg) FROM rows) x; 
myfunc 
-------- 
(2,3) 
(3,4) 
(2 rows) 

열팽창 계수 감안할 때, 다음과 같은 두 가지 SELECT 절은 유형 record의 단일 열이있는 테이블로 서로 동일하게 평가 표시되지 않음) :

SELECT myfunc(arg).col1 FROM rows; 
ERROR: syntax error at or near "." 
LINE 4: SELECT myfunc(arg).col1 FROM rows; 
         ^

SELECT col1 FROM (select myfunc(arg) FROM rows) x; 
ERROR: column "col1" does not exist 
LINE 4: SELECT col1 FROM (select myfunc(arg) FROM rows) x; 
      ^

SELECT col1 FROM (SELECT * FROM (select myfunc(arg) FROM rows) x) y; 
ERROR: column "col1" does not exist 
LINE 4: SELECT col1 FROM (SELECT * FROM (select myfunc(arg) FROM row... 
      ^

튜플의 단일 열에있는 값을 포함하는 다중 열 테이블을 얻는 방법은 무엇입니까?

+1

빙고가 939 –

답변

3

myfunc 주위에 여분의 괄호가 있어야합니다.

select (myfunc(arg)).* from rows; 
+0

빙고가있는 경우'LATERAL '을 사용해 볼 수 있습니다. 이미 올바른 것으로 표시했지만, 가능하다면 Postgres 매뉴얼의 일부를 가리 키기 위해 추가 점을 주면 읽을 수있을 것입니다. 내 뒤늦은 시각은 20/20이 아닙니다. –