Frage

Das folgende Code-Snippet erstellt drei Arrays, die in eine PL / R-Funktion übergeben werden.

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;

Die Arrays deklariert als:

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

Ich würde eher CREATE TYPE verwenden und ein Array übergeben, wobei jedes Element enthält drei Werte.

Wie würden Sie dies so codieren, dass sie keine FOR ... LOOP nicht verwendet?

Die erste Zeile der PL / R-Funktion:

stations <- cbind( v_id, v_longitude, v_latitude )

Ich möchte, dass die Code-Zeile beseitigen und die SELECT Abfrage zu vereinfachen.

Danke.

War es hilfreich?

Lösung

Nach dem pl / r Dokumentation “.. .two-dimensionaler PostgreSQL-Arrays abgebildet werden zu R Matrices ... "

Vielleicht so etwas wie ...

  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

Andere Tipps

Sie können den folgenden Code verwenden und weiterhin unter Verwendung von 3-Arrays:

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

oder den Zeilenkonstruktor verwenden und eine Anordnung eines Verbundtyps zusammenzusetzen:

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

BTW wird, funktioniert das nur auf PostgreSQL 8.4 +

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top