代码之家  ›  专栏  ›  技术社区  ›  Dave Jarvis James Eichele

将查询结果返回到数组中

  •  2
  • Dave Jarvis James Eichele  · 技术社区  · 15 年前

    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 查询。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Dave Jarvis James Eichele    15 年前

    根据 pl/r documentation ,“…二维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
    
        2
  •  1
  •   Diogo Biazus    15 年前

    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+