2012-03-25 67 views
1

表1如何獲得的範圍內的兩行之間

ID Value 

001 100 
002 125 
003 150 
004 175 
005 200 
006 225 
... 

期望輸出

  • 如果用戶輸入之間100到124的值,則ID應顯示001
  • 如果用戶輸入125到149之間的值,然後id應該顯示002

  • 如果用戶輸入的值在200到224之間,那麼id sho ULD顯示005

  • 如果用戶輸入至249 225之間的值,則ID應顯示006

如何使一個查詢上述條件。

需要查詢幫助

+0

能的ID的不斷出訂單?未來可能會發生行7的值爲75的情況嗎? – MatBailie 2012-03-25 12:03:10

回答

2

在這裏你去:

首先創建測試表:

CREATE TABLE #Temp(ID INT, Val INT) 
INSERT INTO #Temp VALUES(1, 100); 
INSERT INTO #Temp VALUES(2, 125); 
INSERT INTO #Temp VALUES(3, 150); 
INSERT INTO #Temp VALUES(4, 175); 
INSERT INTO #Temp VALUES(5, 200); 
INSERT INTO #Temp VALUES(6, 225); 

設置測試值

DECLARE @value INT 
SET @value = 125 

如果ID是連續的(即1,2,3,4,5,等)

SELECT t1.id 
FROM #Temp t1, #Temp t2 
WHERE t1.ID = t2.ID -1 
AND @value BETWEEN t1.Val AND t2.Val -1 

如果ID是不連續的(即1,2,5,7,8,等)

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY id) AS rownum, ID, Val FROM #Temp) 
SELECT t1.id 
FROM cte t1, cte t2 
WHERE t1.rownum = t2.rownum -1 
AND @value BETWEEN t1.Val AND t2.Val -1 
3

它會更容易編寫查詢轉換表像ID,ValueFrom,ValueTo。

對於這種表:

SELECT MAX(ID) 
FROM Table1 
WHERE Value <= @value 

基本上,如果輸入155,編號1 2和3被返回,那麼MAX ID取(3),這是問題的答案。

+1

我同意SQL,假設值始終是按順序的。但是,我完全不同意第一句話。通過在當前表上的'value,id'索引,您可以獲得最佳性能;以相同的順序假設。 – MatBailie 2012-03-25 12:02:12

0

在SELECT語句中使用CASE ....

如:

declare @c int; 
set @c=120; 
SELECT 
    CASE 
    WHEN @c BETWEEN 100 AND 124 THEN '001' 
    WHEN @c BETWEEN 125 AND 149 THEN '002' 
    ELSE 'Other' 
END 
+1

這個答案沒有使用數據庫表。您是否建議每次表中的值更改時更改代碼? – MatBailie 2012-03-25 11:59:12

2

獲取最接近的匹配和值返回第一行之前排序:

select top 1 id 
from range 
where value <= @value 
order by value desc 

或者,如果您需要將此查詢合併到另一箇中:

select id 
    from range 
where value = (select max(value) from range where value <= @value) 
+0

+1:爲OP提供期望的結果並且不假定ID始終處於有序狀態。 – MatBailie 2012-03-25 12:04:09

相關問題