2012-05-10 15 views
2

我有一個表中,有稱爲表A具有下列數據可樂T-SQL: - 在列,但只有這些

ColA 
100 
60 
50 
30 
10 
選擇一個行,其中在一列中的值是等於,大於或小於

我有一個參數叫做@colA

我想只選擇一行。條件是,如果ColA的值匹配@colA,則返回該行。如果找不到匹配項,那麼它會查找ColA和@colA之間差異最小的行。

例如,如果@colA = 50,則返回包含50的行。如果@colA = 58,則返回具有60的行。如果@colA = 33,則返回包含30的行。如果@colA = 200,則返回100行。這可以通過在Select語句中使用Where子句和/或一些Min/Max語句來完成,還是用IF語句測試每個條件會更好?

感謝您的幫助!

+0

你可能想澄清爲何33個返回30,而不是50。你約的話「其中的差別是最小的」令人困惑。我猜如果沒有精確匹配,你想要的數字 - 或者更大或更小 - @colA和那個數字之間的絕對差異最小?關係(如果有的話)呢? – Pondlife

+0

33和30之間的差異小於33和50.如果ColA的值與colA不匹配,我總是希望ColA中的值大於colA的那一行。但是,ColA可能不會等於或大於colA。在這種情況下,我會選擇ColA的值小於colA的那一行。無論colA的價值如何,總會有一排。 – AndroidDev

+0

我仍然感到困惑:你的評論基本上是這樣說的:「如果有一個,我想要下一個最高的數字,否則下一個最低的」。所以33應該返回50,而不是30? – Pondlife

回答

0

這將在MS SQL Server 2008中完成。其他RDBMS需要進行調整。

CREATE TABLE #Test (Data int not null) 
INSERT #Test values (10), (30), (50),(60),(100) 


DECLARE @Target int = 40 

SELECT Data 
from (select 
      Data 
     ,row_number() over (order by abs(@Target - Data), sign(@Target - Data) desc) Ranking 
     from #Test) xx 
where Ranking = 1 

sign原因關係的rigamarole爲正數被解析(即40返回竟被50,而不是30)。

+0

要在@Target = 40時選擇50,我只使用了符號(數據 - @目標)。太感謝了。不知道標誌功能。聰明的解決方案,絕對比IF語句更好。 – AndroidDev

0

試試這個:

DECLARE @ColA INT 
SELECT @ColA = 55 

SELECT TOP 1 @ColA + TA.CA FROM 
(
SELECT MIN(ColA) - @ColA AS CA FROM TableA WHERE ColA > @ColA 
UNION ALL 
SELECT MAX(ColA) - @ColA AS CA FROM TableA WHERE ColA < @ColA 
) AS TA 
ORDER BY ABS(TA.CA)