如何在FOR-Loop中选择进一步计算?

时间:2014-12-12 19:10:26

标签: postgresql for-loop postgis plpgsql

使用postgresql和postgis我有2个openstreetmap表,包含:

  1. 点:具有单个坐标的位置
  2. 多边形:具有坐标集的区域
  3. 现在,我正在尝试遍历Point表,并且对于每个记录,我正在尝试使用postgis函数进行一些计算,例如: ST_Intersects()。然后尝试将结果插入另一个表中。

    到目前为止,我只使用postgis函数进行了简单的SELECT查询,它们基本上是这样的:

    SELECT a.name, b.name
    FROM   table_point AS a, table_polygon AS b
    WHERE  a.name = 'Berlin' AND ST_Intersects(a.way, b.way);
    

    注意:way是包含几何数据的两个表中的列。

    回到我想要操作的循环,我发现自己缺乏plpgsql基础知识。我创建了以下循环结构,但不知道如何为postgis函数选择第二组记录(table_point AS a, table_polygon AS b)。 简:如何选择table_polygon的记录以及FOR循环? 或者,有没有更好的方法来解决这个问题?

    DO
    $do$
    
    DECLARE
    r RECORD;
    
    BEGIN
    FOR r IN SELECT * FROM table_point
    LOOP
    RAISE NOTICE '%', r;
    
    ...
    
    END LOOP;
    END;
    $do$ LANGUAGE plpgsql
    

    在64位Ubuntu 14.04上使用PGSQL 9.3.5。

2 个答案:

答案 0 :(得分:2)

只需将r2定义为记录..

然后执行以下操作:

FOR r IN SELECT * FROM table_point
LOOP
RAISE NOTICE '%', r;
   for r2 in select * from table2 where table2.id=r.somecolumn
   LOOP
   --perform calcs here
   end loop;

END LOOP;

答案 1 :(得分:2)

您在程序上思考,而在大多数情况下,基于集合的方法在关系数据库中更胜一筹。像:

INSERT INTO table_other (point, polygon, result)
SELECT a.name, b.name, calculate(a.?, b.?) AS result -- undefined what to do
FROM   table_point   a
JOIN   table_polygon b ON ST_Intersects(a.way, b.way)
WHERE  a.name = 'Berlin';