我在 Windows 10 中使用 Postgis 2.4 和 posgresql 10。我有以下 SQL 查询:
WITH data (the_geom) as (
SELECT a.gid,
CASE WHEN ST_Within(a.geom,b.geom) THEN a.geom
ELSE ST_Intersection(a.geom,b.geom)
END AS the_geom
FROM source.g100_wby_lakes_r as a
JOIN extents.map_areas as b ON ST_Intersects(a.geom,b.geom)
WHERE b.map_id='AA01'
)
INSERT into public.g100_wby_lakes_r (gid,geom)
select *
from data
where st_GeometryType(the_geom)='MULTIPOLYGON';
Run Code Online (Sandbox Code Playgroud)
它尝试选择两个多边形之间的交点,并且只将相交的几何图形插入到新表中,这些几何图形也是多边形(交点也可能导致点或线)。除了给出以下错误的 WHERE 子句外,所有工作都有效:
WITH data (the_geom) as (
SELECT a.gid,
CASE WHEN ST_Within(a.geom,b.geom) THEN a.geom
ELSE ST_Intersection(a.geom,b.geom)
END AS the_geom
FROM source.g100_wby_lakes_r as a
JOIN extents.map_areas as b ON ST_Intersects(a.geom,b.geom)
WHERE b.map_id='AA01'
)
INSERT into public.g100_wby_lakes_r (gid,geom)
select *
from data
where st_GeometryType(the_geom)='MULTIPOLYGON';
Run Code Online (Sandbox Code Playgroud)
为什么 the_geom 不明确?如何更改 SQL 以使其正常工作?谢谢
您的 CTE:
(
SELECT a.gid,
... AS the_geom
FROM ...
)
Run Code Online (Sandbox Code Playgroud)
生成一个包含 2 列的表,名为gid
和the_geom
。但是“wrap”有一个明显的小故障,它只有一列:
WITH data (the_geom) AS
Run Code Online (Sandbox Code Playgroud)
所以它说该表将被命名data
,第一列(重新)命名为the_geom
. 现在您有 2 列名为the_geom
! 你可以有同样的效果——但更容易发现——如果你写了:
WITH data (the_geom, the_geom) AS
Run Code Online (Sandbox Code Playgroud)
解决方法很简单。从该部分删除列列表:
WITH data AS
( ...
)
Run Code Online (Sandbox Code Playgroud)
或(重新)显式命名两列:
WITH data (gid, the_geom) AS -- explicit
(
SELECT a.gid,
... AS the_geom
FROM ...
)
INSERT INTO public.g100_wby_lakes_r (gid,geom)
SELECT gid, the_geom
FROM data
WHERE st_GeometryType(the_geom) = 'MULTIPOLYGON' ;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
148 次 |
最近记录: |