답변

6

unnest()은 모듈 intarray이 아니지만 표준 PostgreSQL입니다. 그러나, 당신은 need version 8.4 or later이에요.

따라서 최신 버전 9.1로 업그레이드하면 문제를 해결할 수 있습니다. versioning policy of the PostgreSQL project을 참조하십시오.

현재 버전 8.3을 사용하는 Heroku의 공유 데이터베이스를 사용해야하는 경우 업그레이드가 필요합니다. Heroku Labs already offers 9.1.


@Abdul 댓글을 달았습니다, 당신이 구현할 수있는 가난한 사람의 unnest() 버전의 PostgreSQL 8.4 직접 이전 :

CREATE OR REPLACE FUNCTION unnest(anyarray) 
    RETURNS SETOF anyelement AS 
$BODY$ 
    SELECT $1[i] FROM generate_series(array_lower($1,1), array_upper($1,1)) i; 
$BODY$ LANGUAGE sql IMMUTABLE; 

그러나 이것은 단지 한 차원 배열 작동 점에 유의. (PostgreSQL을의 여러 차원으로 배열한다 unnest() 반대로) :

SELECT unnest('{1,2,3,4}'::int[]) -- works 
SELECT unnest('{{1,2},{3,4},{5,6}}'::int[]) -- fails! (returns all NULLs) 

당신 N 차원 배열에 대한 더 많은 기능을 구현할 수 :

CREATE OR REPLACE FUNCTION unnest2(anyarray) -- for 2-dimensional arrays 
    RETURNS SETOF anyelement AS 
$BODY$ 
SELECT $1[i][j] 
FROM (
    SELECT i, generate_series(array_lower($1,2), array_upper($1,2)) j 
    FROM (
     SELECT generate_series(array_lower($1,1), array_upper($1,1)) i 
     ) x 
    ) y; 
$BODY$ LANGUAGE sql IMMUTABLE; 

전화 :

SELECT unnest2('{{1,2},{3,4},{5,6}}'::int[]) -- works! 

여러 차원을 처리하는 PL/pgSQL 함수를 작성할 수도 있습니다 ...

+1

답장을 보내 주셔서 감사합니다. ($ 은 $ 1 [ 복귀 $ BODY AS anyelement를 SETOF) CREATE OR FUNCTION의 unnest (anyarray 교체 [를 I] generate_series (array_lower ($ 1,1) array_upper ($ 1,1)) 내가 FROM; $ 체 $ LANGUAGE 'sql'IMMUTABLE) 이 함수를 작성하여 postgresql에서 unnest 함수를 구현했습니다. 8.3 – Rafiu

+1

@AbdulRafiu : 그래, 그렇게해야합니다. 나는 당신이 나의 대답에 대해 언급하고 약간을 추가했다. –

+0

Brandstetter : 고맙습니다. – Rafiu