You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

代码说明:

  1. 临时表计算距离与排序:先用WITH子句生成临时表,计算table1每个对象和table2所有对象的空间距离,同时用ROW_NUMBER()窗口函数给每个table1的对象分组,按距离从小到大排序,给每条记录标上行号rn——行号为1的就是该table1对象对应的最近table2对象。
  2. 筛选结果并生成标记:主查询筛选行号为1的记录,用CASE根据距离范围生成Comment字段的标记文本。
  3. 注意事项:
    • 替换t1.id、t2.id为你实际表中的主键字段名
    • 确保两个表的geometry字段空间参考一致,否则距离计算会出错
    • 1到50米之间的对象,当前代码返回NULL,你可以改成自己需要的标记

内容的提问来源于stack exchange,提问作者hndovgd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:32:07