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;$$;
在一个函数中,我在所有行上循环一个 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;$$;