Devolver resultados de consulta en una matriz
-
29-09-2019 - |
Pregunta
El siguiente fragmento de código crea tres matrices, que se pasan a una función 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;
Las matrices se declaran como:
v_id integer[];
v_latitude double precision[];
v_longitude double precision[];
I en lugar usaría CREATE TYPE
y pasar una matriz con cada elemento que contiene tres valores.
¿Cómo le codificar esta manera que no utiliza un FOR ... LOOP
?
La primera línea de la función PL / R es:
stations <- cbind( v_id, v_longitude, v_latitude )
Me gustaría eliminar esa línea de código y simplificar la consulta SELECT
.
Gracias.
Solución
De acuerdo con la pl / r documentación ," .. .two dimensiones matrices de PostgreSQL se asignan a las matrices R ... "
Tal vez algo así como ...
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
Otros consejos
Se podría utilizar el siguiente código y continuar utilizando matrices de 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
o utilizar el constructor fila y ensamblar una matriz de un tipo compuesto:
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
Por cierto, esto sólo funcionará en PostgreSQL 8.4 +