2010-09-19 34 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