您可以area
在 plpgsql 中遍历表中的行。但请注意正确引用标识符和值:
假设这个设置:
CREATE TABLE area (
title text PRIMARY KEY
, area_polygon geometry
);
CREATE TABLE points(
point_id serial PRIMARY KEY
, the_geom geometry);
你可以使用这个 plpgsql 块:
DO
$do$
DECLARE
_title text;
BEGIN
FOR _title IN
SELECT title FROM area
LOOP
EXECUTE format('COPY (SELECT p.*
FROM area a
JOIN points p ON ST_INTERSECTS(p.the_geom, a.area_polygon)
WHERE a.title = %L) TO %L (FORMAT csv)'
, _title
, '/path/to/' || _title || '.csv');
END LOOP;
END
$do$;
使用 format with %L
(for string l iteral) 来获得正确引用的字符串,以避免语法错误和可能的SQL 注入。您仍然需要在area.title
该工作中使用字符串作为文件名。)
还要小心地引用整个文件名,而不仅仅是它的标题部分。
您必须将整个命令连接为string。“实用命令”COPY
不允许变量替换。这只能通过核心 DML 命令SELECT
、INSERT
、UPDATE
和DELETE
. 看:
所以不要area.area_polygon
在循环中读出。必须将text
其转换为将其连接到查询字符串中,其中文本表示将被转换回geometry
(或您实际未公开的数据类型是什么)。这很容易出错。
相反,我只阅读area.title
以唯一标识行并在内部处理查询中的其余部分。