问题 没有端点的MySQL BETWEEN


MySQL的BETWEEN包括两个端点之间的所有结果 以及端点

如果expr大于或等于min且expr小于或等于   至最大值,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


2960
2018-01-22 15:09


起源

你被困了......这不是一件坏事。它至少是明确的。 - Michael Berkowski
BETWEEN min + 1 AND max - 1,如果你正在使用整数类型。 - mellamokb
@MichaelBerkowski。谢谢。一直在搜索,但没有找到任何东西,但不确定。好消息是在今天之前,我认为BETWEEN没有包括端点。至少现在我知道了。 - user1032531
@mellamokb哇,这在我脑中很难解析。 - Michael Berkowski
@MichaelBerkowski:我知道,对吧:)这是一个诙谐的答案。 - mellamokb


答案:


我想你可以自己写一下:

where val > start and val < end

之间是:

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)

14
2018-01-22 15:13



您的最后一个建议是如何在没有端点的情况下使用BETWEEEN的创造性方法!不要以为任何人都应该使用它,但它肯定回答了这个问题。我将继续使用前两个解决方案。 - user1032531


注意 BETWEEN 是一个表达,而不是一个功能。它只是一种编码方便,而且意味着所说的内容。没有性能优势。

要排除端点,您必须自己编写代码。


1
2018-01-22 15:16



我想知道这是否真的如此。左侧可能有一些数据库(val)只评估一次 between 但是两次比较会被评估两次。 - Gordon Linoff
@GordonLinoff我不能说它是通用的,但在我使用的数据库上,运行EXPLAIN显示了这一点 a between x and y 被执行为 a >= x and a <= y。 - BellevueBob