6

我正在尝试将 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 行。在这两种情况下,我只得到 column1 值实际上是中间值的行,但是第二种方法给了我更多的结果,所以第一种方法有问题。

我怀疑问题可能出在使用带有列名而不是纯值的 BETWEEN 子句上,并且 SQL 以某种方式将列名转换为实际值。这很奇怪,但是有人可以启发我吗?谢谢

4

3 回答 3

11
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)

这是ORed,你会得到额外的行。

于 2010-09-19T18:08:32.730 回答
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

于 2010-09-19T18:22:51.413 回答
0

您对这两个语句的逻辑不一样:

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

有两个从句。删除第一个,您应该得到与 between 语句相同的结果。

SELECT * FROM table WHERE (column1 >= column2 AND column1 <= column3)
于 2010-09-19T18:13:21.833 回答