2010-09-19 31 views
5

我想要的之间使用的列名,而不是直接的价值,这样的事情:选择BETWEEN列的值

SELECT * FROM table WHERE column1 BETWEEN column2 AND column3; 

这回是17行,但如果我写:

SELECT * FROM table WHERE (column1 <= column2 AND column1 >= column3) OR (column1 >= column2 AND column1 <= column3) 

我得到大约600行.. 在这两种情况下,我只能得到行,其中列1值实际上是中间值,但第二个方法给了我更多的结果,所以第一个方法有什么不妥的地方。

我怀疑问题可能是使用BETWEEN子句与列名,而不是纯粹的值,并且不知何故SQL将列名转换为实际值..奇怪,但有人可以请我吗? 感谢

+2

阅读我的问题2年后者。我甚至都无法理解我是如何期待查询工作的... – 2013-03-04 01:29:34

回答

10
SELECT * FROM table WHERE column1 BETWEEN column2 AND column3; # gives 17 rows 

是相同

SELECT * FROM table WHERE (column1 >= column2 AND column1 <= column3) # gives 17 rows 

由于

(column1 <= column2 AND column1 >= column3) 

你除了检查这是OR版,你会得到更多的排。

+0

哈。好的,所以添加一个额外的column1 BETWEEN column3和column2也可以解决它。 这意味着BETWEEN子句的第一个值实际上是最小值,第二个值是最大值。 感谢您的帮助 – 2010-09-19 18:20:51

+0

我想你没有看到我对其他答案的评论。 – vol7ron 2010-09-19 18:25:04

0

您的这两种说法的逻辑是不一样的:

SELECT * FROM table WHERE (column1 <= column2 AND column1 >= column3) OR (column1 >= column2 AND column1 <= column3) 

有两个子句。删除第一个,你应该有相同的结果作为你之间的声明。

SELECT * FROM table WHERE (column1 >= column2 AND column1 <= column3) 
0
(column1 <= column2 AND column1 >= column3) 

这两个条件仅得到TRUE如果这三个值被排序如下:

column3 <= column1 <= column2 

即,条件是等效于:

column1 BETWEEN column3 AND column2 

同样,

(column1 >= column2 AND column1 <= column3) 

意味着这个顺序:

column2 <= column1 <= column3 

也就是说,条件等同于你的第一个WHERE条款,即:

column1 BETWEEN column2 AND column3 

在这两种情况下,您已经注意到,column1是所有查询结果的中间值。

而且,这两个查询肯定产生不同的结果,因为第一有一个WHERE条款:

column1 BETWEEN column2 AND column3 

,而第二个查询实际上有一个WHERE条款:

(column1 BETWEEN column2 AND column3) OR (column1 BETWEEN column3 AND column2) 

(这意味着BETWEEN .. AND ..运营商的两个右侧操作数的顺序实际上很重要。)

2

Between A And B假设A<B,即Between(A)中的第一个表达式小于第二个表达式(B),它不检查或执行相反的选项。

例如,如果你把Where 3 Between 4 And 2没有行将返回:

,或者,如果你写

Select Case When 3 Between 4 and 2 then 'true' else 'false' end

它将返回false