如何过滤查询结果

use*_*846 3 postgresql

我在 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 以使其正常工作?谢谢

ype*_*eᵀᴹ 9

您的 CTE:

(
  SELECT a.gid,
         ... AS the_geom  
  FROM ...
) 
Run Code Online (Sandbox Code Playgroud)

生成一个包含 2 列的表,名为gidthe_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)