你也可以遍歷您所在地區的行plpgsql中的表。但要小心,以獲得標識符和值正確的引用:
假設這個設置:
CREATE TABLE area (
title text PRIMARY KEY
, area_polygon geometry
);
CREATE TABLE points(
point_id serial PRIMARY KEY
, the_geom geometry);
您可以使用此PLPGSQL塊:與%L
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$;
使用的格式(字符串l iteral)得到正確引用的字符串以避免語法錯誤並且可能的SQL注入。你仍然需要在area.title
,對於文件名工作使用的字符串。)
還細心的引用文件名整體,不只是它的標題的一部分。
注意的「實用程序命令」 COPY
不允許變量替換像在DML與INSERT
,UPDATE
和DELETE
命令。您必須連接整個命令爲字符串。
這就是爲什麼我不在循環中讀出area.area_polygon
。我們必須將其轉換爲text
以將其連接到查詢字符串中,其中文本表示將被轉換回geometry
(或任何您的實際未公開的數據類型)。這很容易出錯。
而是我只讀area.title
來唯一標識該行並在內部處理查詢中的其餘部分。
實際表定義和你的Postgres版本將有助於使這一問題清晰。 –