Rückabfrageergebnisse in einem Array
-
29-09-2019 - |
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.
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 +