У меня есть столбец с именем schedule
с типом данных MULTILINESTRING
.
В LINESTRING
случаев этот столбец содержит все 1 LINESTRING
, поэтому я легко LINESTRING
данные по сценарию
ST_GeometryN(schedule, 1)
а затем я проверяю условия из полученных данных.
Но если этот столбец содержит еще одно LINESTRING
, мне нужно зациклиться на нем, чтобы проверить.
Каков наилучший способ?
Извините за мой плохой английский.
PostgreSQL (PostGIS)
Функция, которую вы ищете, - ST_NumGeometries.
Основываясь на следующей структуре таблицы:
CREATE TEMPORARY TABLE tb (id INT, schedule GEOMETRY);
Содержащие следующие записи:
INSERT INTO tb
VALUES (1,ST_GEOMFROMTEXT('MULTILINESTRING ((10 10, 20 20, 10 40),(40 40, 30 30, 40 20, 30 10))'));
INSERT INTO tb
VALUES (2,ST_GEOMFROMTEXT('LINESTRING (30 10, 10 30, 40 40)'));
Итерируйте по геометриям, используя что-то вроде (быстрое и грязное):
DO $$
DECLARE
i INT DEFAULT 0;
j RECORD;
dim INT DEFAULT 0;
BEGIN
FOR j IN SELECT * FROM tb LOOP
SELECT ST_NumGeometries(j.schedule) INTO dim;
WHILE i < dim LOOP
i:=i+1;
RAISE NOTICE 'Do something with geometry % : %',j.id,(SELECT ST_ASTEXT(ST_GeometryN(j.schedule, i)) );
END LOOP;
i:=0;
END LOOP;
END$$;
Выход:
Do something with geometry 1 : LINESTRING(10 10,20 20,10 40)
Do something with geometry 1 : LINESTRING(40 40,30 30,40 20,30 10)
Do something with geometry 2 : LINESTRING(30 10,10 30,40 40)
В зависимости от того, что вам нужно делать с этими linestrings, я бы предложил включить этот код в функцию.