2

次のコード スニペットは、PL/R 関数に渡される 3 つの配列を作成します。

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;

配列は次のように宣言されます。

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

むしろCREATE TYPE、各要素に 3 つの値を含む 1 つの配列を使用して渡したいと思います。

を使用しないように、これをどのようにコーディングしますFOR ... LOOPか?

PL/R 関数の最初の行は次のとおりです。

stations <- cbind( v_id, v_longitude, v_latitude )

SELECTそのコード行を削除して、クエリを簡素化したいと思います。

ありがとうございました。

4

2 に答える 2

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

または、行コンストラクターを使用して、複合型の配列をアセンブルします。

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

ところで、これはPostgreSQL8.4以降でのみ機能します

于 2010-06-24T00:30:44.543 に答える
1

pl/rのドキュメントによると、「...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
于 2010-06-24T00:46:36.647 に答える