QGIS中Spatialite查询:CASE语法错误,需获取最近对象并分类
正确SQL写法及问题解决
你的核心问题是把CASE逻辑放错了位置——CASE是用来生成字段值的,不能直接塞到WHERE子句里。下面是适配SpatiaLite的正确写法,能实现你要的需求:
WITH nearest_matches AS ( SELECT t1.id AS id1, t2.id AS id2, ST_Distance(t1.geometry, t2.geometry) AS distance, ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY ST_Distance(t1.geometry, t2.geometry) ASC) AS rn FROM table1 t1 CROSS JOIN table2 t2 ) SELECT id1, id2, distance, CASE WHEN distance <= 1 THEN 'Good' WHEN distance > 50 THEN 'Not good' ELSE NULL -- 1到50米之间的可自定义标记,比如留空或写'Medium' END AS Comment FROM nearest_matches WHERE rn = 1;
代码说明:
- 临时表计算距离与排序:先用WITH子句生成临时表,计算table1每个对象和table2所有对象的空间距离,同时用
ROW_NUMBER()窗口函数给每个table1的对象分组,按距离从小到大排序,给每条记录标上行号rn——行号为1的就是该table1对象对应的最近table2对象。 - 筛选结果并生成标记:主查询筛选行号为1的记录,用CASE根据距离范围生成Comment字段的标记文本。
- 注意事项:
- 替换
t1.id、t2.id为你实际表中的主键字段名 - 确保两个表的
geometry字段空间参考一致,否则距离计算会出错 - 1到50米之间的对象,当前代码返回NULL,你可以改成自己需要的标记
- 替换
内容的提问来源于stack exchange,提问作者hndovgd
相关产品推荐
相关产品推荐

