如何在for循环中选择用于进一步的计算?(How to select inside a FOR-Lo

2019-10-21 10:20发布

与PostgreSQL和PostGIS的工作,我有2个OpenStreetMap的表格,包含:

  1. 点:与单个位置的坐标
  2. 多边形:区域与坐标集

现在,我通过点表试图环和每个记录,我试图做一些计算与PostGIS的功能,如ST_Intersects() 然后尝试将结果插入到另一个表。

到目前为止,我只是做了简单的SELECT查询与PostGIS的功能,他们基本的工作是这样的:

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。 我创建了下面的循环结构,但不知道如何选择第二组的记录( table_point AS a, table_polygon AS b的PostGIS的功能)。 短:如何选择记录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

在Ubuntu 14.04 64位使用PGSQL 9.3.5。

Answer 1:

你在考虑程序上,而大多数情况下,基于集合的方法是在关系数据库中更胜一筹。 喜欢:

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';


Answer 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;


文章来源: How to select inside a FOR-Loop for further computations?