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

postgres: How to skip the fist and the last row of a queryset in a for-loop?

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

...
  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 语句检查当前行的几何图形是否与原始线几何图形的起点或终点相同——这是一项相当昂贵的检查。

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

根据您的用例进行调整应该很简单。

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