2

我有一个名为 TableA 的表,在 ColA 列中有以下数据

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 语句测试每个条件来完成更好?

谢谢你的帮助!

4

2 回答 2

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 回答
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

rigamarole withsign导致关系被解决为正数(即 40 将返回 50,而不是 30)。

于 2012-05-10T14:27:55.553 回答