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

MySQL可正常执行的SQL查询在SQLite中执行失败无数据返回

问题:MySQL正常执行的SQL在SQLite中无法返回数据

以下SQL语句在MySQL中可以正常检索数据:

SELECT spot_lat AS lat, spot_lng AS lng, city, place AS title, wiki_img, wiki_url, id AS spot_id, categorie, period
FROM MY_TABLE 
WHERE
    (CASE WHEN 42.7394 < 45.14886
                THEN spot_lat BETWEEN 42.7394 AND 45.14886
                ELSE spot_lat BETWEEN 45.14886 AND 42.7394
    END) 
    AND
    (CASE WHEN 5.1278 < 6.1278
                THEN spot_lng BETWEEN 5.1278 AND 6.1278
                ELSE spot_lng BETWEEN 6.1278 AND 5.1278
    END) 

但在SQLite中执行时无法获取到数据,求原因及解决办法。

原因分析

SQLite与MySQL对CASE表达式的返回值处理存在差异:

  • MySQL中,CASE可以直接返回BETWEEN判断的布尔结果(TRUE/FALSE),WHERE子句能直接识别并使用这个布尔值过滤数据。
  • SQLite中,CASE表达式不会返回布尔类型,而是将BETWEEN的判断结果转换为整数(1代表真,0代表假)。虽然理论上SQLite会把0视为假、非0值视为真,但在这种嵌套判断的场景下,SQLite的执行逻辑无法正确将整数结果转换为WHERE子句需要的布尔条件,导致过滤逻辑失效,从而没有数据返回。

解决办法

用LEAST()和GREATEST()函数替代CASE逻辑,这种写法兼容MySQL和SQLite,且逻辑更简洁:

SELECT spot_lat AS lat, spot_lng AS lng, city, place AS title, wiki_img, wiki_url, id AS spot_id, categorie, period
FROM MY_TABLE 
WHERE
    spot_lat >= LEAST(42.7394, 45.14886) 
    AND spot_lat <= GREATEST(42.7394, 45.14886)
    AND spot_lng >= LEAST(5.1278, 6.1278)
    AND spot_lng <= GREATEST(5.1278, 6.1278)

LEAST()会返回两个值中的较小值,GREATEST()返回较大值,无论输入的两个数值顺序如何,都能正确实现范围过滤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 06:05:03