postgres:如何在for循环中跳过查询集的第一行和最后一行?

时间:2016-07-26 11:28:41

标签: postgresql for-loop stored-procedures skip

在一个函数中,我循环遍历所有行,返回一个select语句。我想跳过第一行和最后一行。我怎么能这样做?

...
  FOR arow IN
    SELECT (dp).path[1] As index, 
           ST_AsText((dp).geom) As wktnode, 
           (dp).geom As vertex
      FROM (SELECT 
          ST_DumpPoints(
              ST_Segmentize(NEW.the_geom,
                  -- the max length of the segment 
                  ST_Length(
                      NEW.the_geom
                  )/NEW.dist_calc_pnts
              )
          ) AS dp
    ) As foo
    LOOP

      test_me := arow.index;
      IF NOT (ST_Equals(arow.vertex, ST_StartPoint(NEW.the_geom))
                      OR
             ST_Equals(arow.vertex, ST_EndPoint(NEW.the_geom))) THEN

      RAISE NOTICE 'Calling update_pntzzz(%)', test_me;
      INSERT INTO 
         pntzzz(onedee_id, the_geom)
      VALUES(NEW.id, arow.vertex);
      END IF;
    END LOOP;
...

正如我所说,我不需要第一次和最后一次迭代的结果,但我正在努力实现这一点。现在,if语句检查当前行的几何形状是否与原始线几何的起点或终点相同 - 这是一个相当昂贵的检查。

1 个答案:

答案 0 :(得分:1)

这是一些示例代码,用于说明如何跳过循环中的第一个和最后一个元素。

根据您的使用情况调整它应该很简单。

DO $$DECLARE
   counter integer := 0;
   i integer;
   old_i integer;
BEGIN
   FOR i IN 1..10 LOOP
      counter := counter + 1;
      IF counter > 2 THEN
         -- processing of old_i goes here
         RAISE WARNING 'Processing row %', old_i;
      END IF;

      old_i := i;
   END LOOP;
END;$$;