MySQL 查询正常时 SQLite 查询失败

问题描述 投票:0回答:1

当我在 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
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.