MySQL BETWEEN不包括端点

15
MySQL的BETWEEN运算符包括两个端点以及其之间的所有结果。
如果expr大于或等于min并且expr小于或等于max,BETWEEN返回1,否则返回0。如果所有参数都是相同类型,则这相当于表达式(min <= expr AND expr <= max)。 参考-http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html#operator_between
是否有像REALLYBETWEEN这样不包括端点的函数,还是我必须使用 min < expr AND expr < max

2
你卡住了...但这并不是什么坏事。至少它是明确的。 - Michael Berkowski
3
如果你正在使用整数类型,那么BETWEEN min + 1 AND max - 1表示在最小值加一和最大值减一之间。 - mellamokb
@MichaelBerkowski。谢谢。我一直在搜索,但没有找到任何东西,也不确定。好消息是,在今天之前,我认为BETWEEN不包括端点。至少现在我知道了。 - user1032531
5
哇,这真是让我大脑难以理解。 - Michael Berkowski
@user1032531...实际上,这可能是一个好问题。我认为所有的替代方案都可能导致左侧被评估两次,而使用between只需要评估一次。如果比较涉及到昂贵的函数或子查询,这可能会对性能产生重大影响。 - Gordon Linoff
显示剩余3条评论
2个回答

18

我认为您可以自己编写如下代码:

where val > start and val < end

Between是指:

where val >= start and val <= end

关于索引,前两个应该正确地使用一个索引,并且与between相同,假设开始和结束是常量。我不确定最后一个版本是否会这样做。

如果val是一个复杂的表达式,则考虑以下内容:

select *
from (your query here) t
where t.val > start and t.val < end

这应该只评估一次val。我认为其他形式会评估它两次。
或者,你可以这样做:
where val between start and end and val not in (start, end)

1
您最后的建议是一种创新的方法,可以在没有端点的情况下使用BETWEEEN!我认为没有人应该使用它,但它确实回答了问题。我将继续使用前两种解决方案。 - user1032531

2
请注意,BETWEEN是一个表达式而非函数。它只是编码的便利,意思就是字面意思。没有性能上的优势。
要排除端点,你必须自己编写代码。

我想知道这是否真的是真的。在某些数据库中,左侧(val)可能仅针对between评估一次,但对于两个比较而言则会评估两次。 - Gordon Linoff
@GordonLinoff 我不能说这是普遍的,但在我使用的数据库上,运行EXPLAIN会显示a between x and y被执行为a >= x and a <= y - BellevueBob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接