Retour Regrouper les résultats dans un tableau
-
29-09-2019 - |
Question
L'extrait de code suivant crée trois tableaux, qui sont passés dans une fonction PL / R.
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;
Les tableaux sont déclarés comme:
v_id integer[];
v_latitude double precision[];
v_longitude double precision[];
je préfère utiliser CREATE TYPE
et de transmettre une matrice, chaque élément contenant trois valeurs.
Comment qualifieriez-vous le coder afin qu'il n'utilise pas FOR ... LOOP
?
La première ligne de la fonction PL / R est la suivante:
stations <- cbind( v_id, v_longitude, v_latitude )
Je voudrais supprimer cette ligne de code et de simplifier la requête SELECT
.
Merci.
La solution
Selon le pl / documentation r , » .. .TWO dimensions des tableaux de PostgreSQL sont mis en correspondance avec R ... matrices "
Peut-être quelque chose comme ...
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
Autres conseils
Vous pouvez utiliser le code suivant et continuer à utiliser 3 tableaux:
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
ou utiliser le constructeur de ligne et d'assembler un tableau d'un type composite:
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, cela ne fonctionne que sur PostgreSQL 8.4 +