MySQL查询工作时SQLite查询失败[关闭]

hivapdat  于 12个月前  发布在  SQLite
关注(0)|答案(1)|浏览(148)

**已关闭。**此问题为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中的相同命令失败(不检索数据)。
谁能解释一下为什么?
谢谢

ijnw1ujt

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语句。下面是一个示例:

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.148865.1278 < 6.1278是固定的,而不是动态的。如果您需要动态条件,您可能需要相应地调整查询。

相关问题