2010-08-17 62 views
1

以下是此表的表格和腳本。查找表格中處於最小和最大範圍內的行

DECLARE @temp TABLE (PPId INT, SVPId INT, Minimum INT, Maximum INT) 

INSERT INTO @temp VALUES(1,1,8,20) 
INSERT INTO @temp VALUES(2,1,21,100) 

alt text

最小&最大傳遞作爲參數。我想查找所有落在給定範圍內的行。

E.g .;

  • 如果@minimum = 9和@maximum = 15 然後它落在第一 行的範圍內。
  • 如果@minimum = 21和@maximum = 22 那麼它落在第2行 行的範圍內。
  • 如果@minimum = 7和@maximum = 25 那麼它落在兩個 行的範圍內,所以應該返回兩行。

謝謝。

+0

而且桌子上的範圍保證不重疊? – NullUserException 2010-08-17 09:59:00

+0

是的,範圍不會重疊。事實上,我正在這樣做,以確保這一點。 – Kashif 2010-08-17 10:02:46

+3

爲什麼輸入'18 22''匹配'21 100'而不是*'8 20''? – AakashM 2010-08-17 10:03:15

回答

3

當比較這樣的範圍時,更容易查找範圍不重疊的情況。有兩個範圍可以重疊許多不同的方式,但只有兩種方式的不重疊:

select * 
from @temp 
where not (@maximum < Minimum or @minimum > Maximum) 
+0

謝謝Guffa,很大的幫助。 – Kashif 2010-08-17 10:49:55

2
SELECT * 
FROM @temp 
WHERE minimum <= @max 
     AND maximum >= @min 
+0

它有時可能會讓某些人試圖認識到這涵蓋了所有的組合(部分重疊,以及完全在另一個範圍內的一個範圍)。即將張貼相同。 – 2010-08-17 10:22:50

+0

我認爲這是我最喜歡的迴應。 – 2010-08-17 10:27:06

+0

注意:將最終值視爲獨佔而非包含,即範圍8-20和20-22不重疊。 – Guffa 2010-08-17 10:32:08

0

我建議的答案就是這麼簡單,我懷疑任我失去了一些東西或問題不完整?

SELECT * 
FROM @temp 
WHERE Minimum < @Minimum 
    AND Maximum > @Maximum 
+0

這發現行與@min和@max範圍完全重疊,而不是部分重疊(其中@min或@max落在由特定行定義的範圍內) – 2010-08-17 10:21:12

0

我可以看到你正在嘗試做什麼。你想知道有多少最小/最大範圍與提供的最小/最大範圍重疊。試試這個:

SELECT * FROM @temp T 
WHERE @minimum BETWEEN T.minimum AND T.maximum 
OR  @maximum BETWEEN T.minimum AND T.maximum 
OR  T.minimum BETWEEN @minimum AND @maximum 
OR  T.maximum BETWEEN @minimum AND @maximum 

這應該返回與區間[@minimum,@maximum]相交的所有行。

+0

這比我手工挑選出來的其他行更長我自己的C#代碼正在尋找實際的交集(因此必須將其分解成每個場景分開),而不僅僅是交集的布爾成功。 Guffa和Quassnoi的其他選項在測試路口是否爲空時更好。 – 2010-08-17 10:29:55

相關問題