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

SQL空间查询问题:点不在多边形内无返回结果的解决

问题:点不在多边形内时SQL未返回预期结果

我编写了一段SQL语句,可基于经纬度生成点,并根据点的位置返回对应结果:若点位于具备特定属性值的多边形区域内,则返回相应结果(逻辑详见下方CASE语句):

SELECT
CASE
        WHEN p.column1 IS NOT NULL AND p.column2 = 'Yes' THEN 'Response_A'
        WHEN p.column1 IS NOT NULL AND p.column2 = 'No' THEN 'Response_B'
        WHEN p.column1 IS NOT NULL AND p.column2 IS NULL THEN 'Response_C'
        ELSE 'Outside Polygon'
    END AS Status,
    p.column1,
    p.column2,
    p.geometry
FROM
    my.table AS p
WHERE ST_Intersects(ST_SetSRID(ST_MakePoint(LONGITUDE, LATITUDE), 4326),
    ST_Transform(p.geometry, 4326))

但实际运行时发现问题:当点不在任何多边形内时,查询返回空表,而非预期的'Outside Polygon'。已知在多边形内的经纬度能正常得到结果,但不在多边形内的经纬度完全没有返回数据,ELSE语句根本没生效。

我尝试了以下几种方法,都没能解决问题:

  • 将ST_Intersects替换为ST_Within,问题依旧;
  • 添加CASE分支:
WHEN NOT ST_Within(ST_SetSRID(ST_MakePoint(LONGITUDE, LATITUDE), 4326), p.geometry) THEN 'Outside Polygon'
  • 尝试自左连接,但未成功。

最终我找到了可行的查询语句:

SELECT
    CASE
        WHEN EXISTS (
            SELECT 1
            FROM my.table AS p
            WHERE
                ST_Intersects(ST_SetSRID(ST_MakePoint(longitude, latitude), 4326), ST_Transform(p.geometry, 4326))
                AND p.column1 IS NOT NULL
                AND p.column2 = 'Yes'
        ) THEN 'Response A'
        WHEN EXISTS (
            SELECT 1
            FROM my.table AS p
            WHERE
                ST_Intersects(ST_SetSRID(ST_MakePoint(longitude, latitude), 4326), ST_Transform(p.geometry, 4326))
                AND p.column1 IS NOT NULL
                AND p.column2 = 'No'
        ) THEN 'Response B'
        WHEN EXISTS (
            SELECT 1
            FROM my.table AS p
            WHERE
                ST_Intersects(ST_SetSRID(ST_MakePoint(longitude, latitude), 4326), ST_Transform(p.geometry, 4326))
                AND p.column1 IS NOT NULL
                AND p.column2 IS NULL
        ) THEN 'Response C'
        WHEN NOT EXISTS (
            SELECT 1
            FROM my.table AS p
            WHERE
                ST_Intersects(ST_SetSRID(ST_MakePoint(longitude, latitude), 4326), ST_Transform(p.geometry, 4326))
        ) THEN 'Outside Polygon'
        ELSE 'Error'
    END AS Status,
    (
        SELECT ST_SetSRID(ST_MakePoint(longitude, latitude), 4326) AS point
    ) AS CreatedPoint;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 03:42:37