我在 Postgres 10.3/Postgis 2.4 上运行以下查询:
create table table_c as (
select A.*, B.area_name, B.id
from table_a A
left join table_b B
on ST_Contains(A.geom, B.geom)
);
以神秘的方式失败:
ERROR: GEOSContains: TopologyException: side location conflict at -2.0889721121124643 53.528652265475735
由于 Postgis(和相关使用的库)。
有没有办法跳过异常情况并保持查询运行直到完成?
您可以将 PostGIS 函数包装在
ST_Contains()
您自己的 plpgsql(或其他 PL)函数中,并在那里捕获异常。喜欢:这将返回
FALSE
而不是引发错误。您可能想要返回NULL
。对您的查询有同样的影响。ST_Contains()
并在您的查询中使用它而不是:模式限定函数定义(和调用)中的函数名称以消除对搜索路径的依赖:
不确定对性能的影响(尤其是索引使用);没有测试。
我认为最好的方法是使用以下命令过滤查询或为数据添加前缀:
ST_IsValidReason、ST_IsValid、ST_MakeValid。
http://postgis.refractions.net/docs/ST_IsValidReason.html