为何SQL语句`20 >= price < 500`不报错?实际执行逻辑是什么?
为什么
20 >= price < 500这种SQL语句不报错,实际执行逻辑是什么? 多数常用SQL数据库(比如MySQL、PostgreSQL)都支持连续比较的语法,这其实是符合SQL标准的写法,但它的执行逻辑和你直觉里的范围判断完全不同:
执行顺序拆解
数据库会从左到右逐步计算表达式:- 先算
20 >= price,得到布尔结果——SQL里布尔值会自动转成数值,TRUE对应1,FALSE对应0。 - 再拿第一步得到的1或0,和
500比较,也就是判断(20 >= price) < 500。
- 先算
实际等价效果
因为1和0都小于500,所以不管20 >= price是真还是假,整个表达式的结果永远是TRUE,最终会返回表中所有记录——这就是它和你预期的price >=20 AND price <500结果不符的原因。
如果要筛选价格在[20, 500)区间的记录,必须用AND明确连接两个条件,也就是你给出的正确写法:
SELECT item FROM inventory WHERE price >= 20 AND price < 500;
内容的提问来源于stack exchange,提问作者pyte
相关产品推荐
相关产品推荐

