2011-08-05 3 views
7

두 요소가 포함 된 배열을 반환하는 PostgreSQL (PLPGSQL)의 함수가 있습니다. 나는 함수를 호출하는 SELECT 문을 실행할 때, 나는 (예상대로) 배열을 포함하는 열을 얻을 :함수에서 열로 반환 된 PostgreSQL 변환 배열

[ 1 | 2 ] 
: 내가 정말하고 싶은 무엇

{1, 2} 

자신의 컬럼으로 이러한 요소를 추출입니다

나는 내가 할 수있는 것을 발견했다 :

SELECT (MyFunction())[1], (MyFunction())[2] 

하지만 그 때문에 실행 시간 (이 기능은 매우 시간이 걸리는 기능입니다) 배, 두 번 함수를 호출합니다. 이 문제를 해결할 더 좋은 방법이 있습니까?


UPDATE 여기

내가 가진 것의 거의 완벽한 복제입니다 :

SELECT table1.a, table1.b, table1.c, (MyFunction(table1.a, table1.b, table1.c))[1], 
(MyFunction(table1.a, table1.b, table1.c))[2] 
FROM table1 
INNER JOIN table2 using(b) 
WHERE ... GROUP BY table1.a, table1.b, table1.c; 

는 다시,이 배열에서 두 개의 열을 생산하지만 내 함수를 두 번 호출되고, 내 런타임을 두 배로 늘립니다.

+0

이해야 당신 배열을 돌려 주겠습니까?아마 그 줄이 있어야합니다. 리팩토링 할 능력이 있습니까? – lightningmanic

+0

될 것입니다 점에 유의한다 – SingleNegationElimination

답변

7

subselect를 사용할 수 있습니까?

postgres=# select ar[1], ar[2] from (select string_to_array('a b c', ' ') ar) as sq; 
ar | ar 
----+---- 
a | b 
(1 row) 

이 경우에도 이미 (이미 수행 한 것처럼) 각 열을 명시 적으로 추출해야합니다. 추출 된 것보다 배열에 더 많은 요소가있는 경우 해당 요소가 손실되고 더 적 으면 누락 된 열은 NULL이됩니다.

편집 : 나는 모든 것을 subselect로 감쌀 것입니다.

SELECT subquery1.a, subquery1.b, subquery1.c, 
    myfunction_result[1], myfunction_result[2] 
FROM (SELECT table1.a, table1.b, table1.c, 
       MyFunction(table1.a, table1.b, table1.c) as myfunction_result 
     FROM table1 INNER JOIN table2 using(b) 
     WHERE ... GROUP BY table1.a, table1.b, table1.c 
) AS subquery1; 

내외 적절히 선택 table1 참조를 상관한다 : 내부 부속은 외부로 원하는 가 원하는 로 내부 쿼리 돌출 선택 생성한다.

+0

이것은 일반적인 "로컬 변수"트릭 중 하나이며 배열의 요소 수가 고정되어있는 한 계속 작동해야합니다. –

+0

유일한 문제는 아마도이 기능을 동일한 쿼리 수준의 다른 관계에 의존한다는 것입니다. 그래서 "table_id"를 선택하고 동일한 id를 함수에 전달합니다. – lightningmanic

+0

@mu가 너무 짧습니다. 전혀 사실이 아닙니다. 편집을 참조하십시오. – SingleNegationElimination

2

당신은 그렇게 할 수 없습니다. 단일 배열 열은 예를 들어 3 개의 요소가있는 배열 하나와 5 개의 요소가있는 배열을 가질 수 있습니다. 해당 배열을 개별 열로 확장하려고 시도하면 이 끝나고 결과 집합에 다른 숫자가 열이며 허용되지 않는 행이 두 개 있습니다.

사용할 수있는 가장 가까운 것은 unnest입니다 :

expand an array to a set of rows

을하지만 그건 당신이 할 열이 아니라 행을 제공합니다.

2
select data[1] as id, data[2] as value from (SELECT 
string_to_array(rs,':') as data from unnest(string_to_array('1:234,2:400',',')) as rs) as foo 

이 발생합니다 같은 :

id|Value 
-------- 
1 | 234 
2 | 400 
내가 반환 된 결과의 모양이 알려진 경우 반환 배열의 요소 수는 항상 2 ...