TSQL - эффективный метод, чтобы найти, где число попадает в список значений? - PullRequest
0 голосов
/ 18 мая 2011

Это кажется простым;Я должен пропустить что-то прямо вперед.

TestTable
Value1 (int)
Value2 (int)
Value3 (int)
Value4(int)

Вставить в TestTable 20, 30, 40, 50

Value1 = 20
Value2 = 30
Value3 = 40
Value4 = 50

У меня есть номер 37. Я хочу вернуть 30 и 40 (37 попадает между этими двумя числами).

Как наиболее эффективно использовать TSQL?

Ответы [ 3 ]

1 голос
/ 18 мая 2011
declare @TestTable table (Value1 int, Value2 int, Value3 int, Value4 int)
insert into @TestTable values (20, 30, 40, 50)

declare @Value int = 37

select
  case
    when @Value between Value1 and Value2 then Value1
    when @Value between Value2 and Value3 then Value2
    when @Value between Value3 and Value4 then Value3
    when @Value > Value4 then Value4
  end as Val1,   
  case
    when @Value < Value1 then Value1 
    when @Value between Value1 and Value2 then Value2
    when @Value between Value2 and Value3 then Value3
    when @Value between Value3 and Value4 then Value4
  end as Val2
from @TestTable  

Результат:

Val1        Val2
----------- -----------
30          40
0 голосов
/ 18 мая 2011

Вы бы заменили 34 на переменную, содержащую значение, которое вы хотите найти, но я думаю, что это должно дать вам то, что вы хотите.

select
(select top 1 * from TestTable
where value > 34
order by value),

(select top 1 * from TestTable
where value < 34
order by value desc)
0 голосов
/ 18 мая 2011
SELECT TOP 1 [value] FROM TestTable WHERE [value] <= @number ORDER BY [value] DESC
UNION
SELECT TOP 1 [value] FROM TestTable WHERE [value] >= @number ORDER BY [value]

В качестве альтернативы

SELECT
  (SELECT TOP 1 [value] FROM TestTable WHERE [value] <= @number ORDER BY [value] DESC) AS [min],
  (SELECT TOP 1 [value] FROM TestTable WHERE [value] >= @number ORDER BY [value]) AS [max]

Иметь индекс в поле [value] и проверить, хотите ли вы >= / <= или >= / < range.g

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...