**已关闭。**此问题为not reproducible or was caused by typos。目前不接受回答。
这个问题是由错字或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天就关门了。
Improve this question的
当我在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中的相同命令失败(不检索数据)。
谁能解释一下为什么?
谢谢
1条答案
按热度按时间ijnw1ujt1#
相同的查询在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
语句。下面是一个示例:字符串
在这个修改后的查询中,使用单独的
OR
条件来处理基于比较结果的范围。这种方法在SQLite中提供了与MySQL类似的所需行为。请注意,此修改假设条件
42.7394 < 45.14886
和5.1278 < 6.1278
是固定的,而不是动态的。如果您需要动态条件,您可能需要相应地调整查询。