إرجاع نتائج الاستعلام في صفيف
-
29-09-2019 - |
سؤال
يقوم مقتطف الكود التالي بإنشاء ثلاث صفائف ، يتم تمريرها في وظيفة 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;
تم الإعلان عن المصفوفات على النحو التالي:
v_id integer[];
v_latitude double precision[];
v_longitude double precision[];
أفضل استخدام CREATE TYPE
وتمرير مجموعة واحدة مع كل عنصر يحتوي على ثلاث قيم.
كيف يمكنك ترميز هذا حتى لا يستخدم FOR ... LOOP
?
السطر الأول من وظيفة PL/R هو:
stations <- cbind( v_id, v_longitude, v_latitude )
أود التخلص من هذا السطر من الكود وتبسيط SELECT
استفسار.
شكرًا لك.
المحلول
بحسب ال وثائق PL/R, ، "... يتم تعيين صفائف 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
نصائح أخرى
يمكنك استخدام الكود التالي والمتابعة باستخدام 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
راجع للشغل ، هذا سيعمل فقط على postgresql 8.4+
لا تنتمي إلى StackOverflow