SQLite SELECT查询WHERE子句不生效、过滤规则被忽略问题求助
问题原因
- 逻辑运算符优先级错误:SQL 中
AND的优先级高于OR,你最初未把两个地点条件用括号包裹时,实际执行逻辑为(地点符合k%ln) OR (地点符合d%sseldorf 且 日期符合 且 距离符合),只要地点匹配k%ln的记录都会直接返回,完全忽略后续的日期、距离过滤条件。 - 日期值格式错误未加引号:你写的
DATE(Time) BETWEEN 2021/10/06 and 2021/10/11中,未加引号的日期会被SQLite解析为算术表达式:2021÷10÷6≈33.68,2021÷10÷11≈18.37,最终等价于BETWEEN 33.68 AND 18.37,这个区间本身无效,日期过滤条件直接失效,因此会返回所有符合地点条件的记录,不管日期和距离是否符合要求。
解决方案
修正括号逻辑、日期格式即可正常执行,正确查询语句如下:
SELECT * FROM Gasstation WHERE (LOWER(Place) LIKE 'k%ln' OR LOWER(Place) LIKE 'd%sseldorf') AND (DATE(Time) BETWEEN '2021-10-06' AND '2021-10-11') AND Distance <= 0.3;
补充注意事项:
- SQLite的
DATE()函数返回的是YYYY-MM-DD格式的字符串,用于比较的日期值必须用单引号包裹,且使用横杠-作为分隔符,避免被解析为算术运算。 - 所有用
OR连接的并列条件必须用括号单独包裹,避免被AND的高优先级打乱判断逻辑。
内容的提问来源于stack exchange,提问作者Erwin109
相关产品推荐
相关产品推荐

