2

TableAというテーブルがあり、ColA列に次のデータがあります

ColA
100
60
50
30
10

@colAというパラメータがあります

1行だけを選択したい。基準は、ColAの値が@colAと一致する場合、その行が返されるというものです。一致するものが見つからない場合は、ColAと@colAの差が最も小さい行を探します。

たとえば、@ colA = 50の場合、50の行が返されます。@colA = 58の場合、60の行が返されます。@colA = 33の場合、30の行が返されます。@colA = 200の場合、100の行が返されます。これは、SelectステートメントでWhere句やいくつかのMin / Maxステートメントを使用するだけで実行できますか、それとも各条件をテストするIFステートメントで実行する方がよいでしょうか。

ご協力いただきありがとうございます!

4

2 に答える 2

0

これは、MS SQLServer2008で実行されます。他の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、正の数の同点を解決します(つまり、30ではなく40のウォールリターン50)。

于 2012-05-10T14:27:55.553 に答える
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)
于 2012-05-10T14:34:19.857 に答える