t-sql: диапазон возврата, в который попадает данное число - PullRequest
0 голосов
/ 22 февраля 2011

Я пытаюсь найти хороший способ вернуть строку 'name' из диапазона, в который попадает данное число.Диапазоны - это диапазоны 1000, поэтому первый диапазон - «0000-0999», второй - «1000-1999» и т. Д. Например, учитывая число 1234, я хочу вернуть буквальную строку '1000-1999'.

Мне кажется, что я мог бы вести справочную таблицу с этими диапазонами, как это

--create & populate temp table with ranges
create table #ranges (st int,en int)
go
insert into #ranges values(0,999)
insert into #ranges values(1000,1999)
insert into #ranges values(2000,2999)
go

--example query
select replace(str(st,4),' ','0') + '-' + replace(str(en,4),' ','0') as TheStringIWant
from #ranges 
where 1234 between st and en

... но мне кажется, что диапазоны должны быть в состоянии быть определены из самого данного числаи что мне не нужна (избыточная) справочная таблица (или, если уж на то пошло, функция) только для этого.

Мне также кажется, что я должен быть в состоянии понять это, простонемного мозгов, за исключением того, что я только что выпил 2 пива в быстрой последовательности этим вечером ...

Ответы [ 4 ]

2 голосов
/ 22 февраля 2011

Другой способ;

select case when value / 1000 < 1 
    then '0000-0999' 
    else cast(value / 1000 * 1000 as varchar(16)) + '-' + cast(value / 1000 * 1000 + 999 as varchar(16)) 
end
1 голос
/ 22 февраля 2011

Вы можете использовать математические функции, чтобы избежать использования временной таблицы:

SELECT 1234, 
RIGHT('0000' + CAST(FLOOR(1234/1000.0) * 1000 AS VARCHAR(11)),4)
+ '-'
+ RIGHT('0000' + CAST( (FLOOR(1234/1000.0) * 1000) + 999 AS VARCHAR(11)),4)
0 голосов
/ 22 февраля 2011
declare @range int;
set @range = 1000;
select replace(str(st,4),' ','0') + '-' +
       replace(str(st + @range,4),' ','0') as TheStringIWant
from (
  select st = v / @range * @range
  from (select v = 1234) s
) s
0 голосов
/ 22 февраля 2011

В оболочке я могу использовать целочисленную арифметику, чтобы обрезать 234, и вычислить строку с простой формулой, однако она не выдаст 0000-0999, но 0-999 для первой 1000.

v=1234
echo $(((v/1000)*1000))-$(((v/1000)*1000+999))

1000-1999

Я не знаю, как адаптировать его к tsql - возможно ли вообще.

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