2010-06-23 10 views
2

다음 코드 조각은 PL/R 함수로 전달되는 세 개의 배열을 만듭니다. 차라리 CREATE TYPE를 사용하여 세 개의 값을 포함하는 각 요소에 하나 개의 어레이를 통과 할쿼리 결과를 배열로 반환

v_id integer[]; 
    v_latitude double precision[]; 
    v_longitude double precision[]; 

:로

FOR s_id, s_latitude, s_longitude IN 
    SELECT 
    s.id, 
    s.latitude_decimal, 
    s.longitude_decimal 
    FROM 
    climate.station s 
    WHERE 
    s.applicable AND 
    s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND 
    s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max 
LOOP 
    SELECT array_append(v_id, s_id) INTO v_id; 
    SELECT array_append(v_latitude, s_latitude) INTO v_latitude; 
    SELECT array_append(v_longitude, s_longitude) INTO v_longitude; 
END LOOP; 

어레이 선언된다.

FOR ... LOOP을 사용하지 않도록 어떻게 코드 하시겠습니까?

는 PL/R 함수의 첫 번째 줄은 다음과 같습니다

stations <- cbind(v_id, v_longitude, v_latitude) 

내가 코드 줄을 제거하고 SELECT 쿼리를 단순화하고 싶습니다.

감사합니다.

답변

1

pl/r documentation에 따르면 "2 차원 PostgreSQL 배열은 R 행렬에 매핑됩니다 ..."

아마도 ...

SELECT 
    plr_function(
     array_agg(array[s.id,s.latitude_decimal,s.longitude_decimal]) 
    ) 
    FROM 
    climate.station s 
    WHERE 
    s.applicable AND 
    s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND 
    s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max 
1

다음과 같은 코드를 사용하고 3 개 배열을 계속 사용할 수 있습니다 :

SELECT 
    array_agg(s.id), 
    array_agg(s.latitude_decimal), 
    array_agg(s.longitude_decimal) 
INTO 
    v_id, v_latitude, v_longitude 
FROM 
    climate.station s 
WHERE 
    s.applicable AND 
    s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND 
    s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max 

또는 행 생성자를 사용하여 복합 형의 배열 조립 : BTW

SELECT 
    array_agg((
    s.id, 
    s.latitude_decimal, 
    s.longitude_decimal 
)) 
INTO 
    v_id, v_latitude, v_longitude 
FROM 
    climate.station s 
WHERE 
    s.applicable AND 
    s.latitude_decimal BETWEEN box.latitude_min AND box.latitude_max AND 
    s.longitude_decimal BETWEEN box.longitude_min AND box.longitude_max 

을, 이것은 단지 일 것입니다 PostgreSQL 8.4 이상

관련 문제