2016-10-14 122 views
2

假設有一個包含以下列的表t:Code int,Name nvarchar(50)。SQL查詢選擇等於或小於或大於

我想查詢表中最匹配的行爲給定的代碼c。 「最匹配的」標準(在重要性的順序排列):

  • 1)選擇一個行,其代碼匹配C
  • 2)選擇的行,其代碼是大於c(但很第一個)。例如,如果c = 4且t 包含1,2,3,5,6和7,我想選擇5.
  • 3)選擇一行,其代碼小於c。例如,如果c = 4且t包含3,2和 1,我想選擇3.

代碼將存儲在存儲過程中。

有人可以請建議如何完成上述。

謝謝。

樣本數據和預期的結果:

1, "Name1" 
2, "Name2" 
4, "Name4" 
5, "Name5" 

If c=2, result: 2,"Name2" 
If c=3, result: 4,"Name4" 
if c=6, result: 5,"Name5" 
+0

發佈一些示例數據和預期的結果,您的嘗試。 –

+1

仍然不清楚您的輸入表和輸出結果集。你能提供那個嗎? –

回答

1

我會通過兩個標準命令行 - 從目標數的絕對距離以及它是否比它大或小,只是挑頂行。例如,假設目標代碼是4:

SELECT TOP 1 * 
FROM  t 
ORDER BY ABS(code - 4) ASC, CASE WHEN code > 4 THEN 1 ELSE 0 END DESC 
1

這是第一個查詢;你想要一個最好的匹配記錄。因此請在ORDER BY中按照所需順序選擇TOP 1

select top 1 * 
from mytable 
order by 
    case when code = @code then 1 
     when code > @code then 2 
     else 3 
    end, 
    abs(code - @code);