当我在 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 中的同一个失败(未检索到任何数据)。
有人可以解释我为什么吗?
谢谢你。
同样的查询在 MySQL 中有效但在 SQLite 中失败的原因是这些数据库系统处理
CASE
语句的方式不同。
在MySQL中,
CASE
语句评估条件并返回相应的结果。在您的查询中,当条件 42.7394 < 45.14886
为 true 时,它执行第一个 THEN
子句,当条件为 false 时,它执行第二个 THEN
子句。此行为允许您根据比较结果动态调整范围条件。
但是,在 SQLite 中,
CASE
语句的行为有所不同。它评估条件但返回第一个匹配条件的结果。在您的查询中,当条件 42.7394 < 45.14886
为 true 时,它会计算第一个 CASE
表达式并返回 spot_lat BETWEEN 42.7394 AND 45.14886
的结果。如果条件为 false,它将计算第二个 CASE
表达式并返回 spot_lat BETWEEN 45.14886 AND 42.7394
的结果。此行为不会像 MySQL 中那样根据比较结果动态调整范围条件。
要使查询在 SQLite 中工作,您可以修改它以使用单独的
OR
条件而不是 CASE
语句。这是一个例子:
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
(42.7394 < 45.14886 AND spot_lat BETWEEN 42.7394 AND 45.14886)
OR (42.7394 >= 45.14886 AND spot_lat BETWEEN 45.14886 AND 42.7394)
AND (5.1278 < 6.1278 AND spot_lng BETWEEN 5.1278 AND 6.1278)
OR (5.1278 >= 6.1278 AND spot_lng BETWEEN 6.1278 AND 5.1278);
在此修改后的查询中,使用单独的
OR
条件来根据比较结果处理范围。这种方法在 SQLite 中提供了与 MySQL 中类似的所需行为。
请注意,此修改假设条件
42.7394 < 45.14886
和 5.1278 < 6.1278
是固定的而不是动态的。如果需要动态条件,可能需要相应调整查询。