2016-10-18 1 views
1

У меня есть данные, которые (в основном) просто цифры:Как найти значение в диапазоне строк

id start  end 
1 1420010  1421011 
2 B420010  B421011 
3 1420010  1422011 
4 7505017  7505017 

Это действительно кажется, что она была дополнена пробелами во многих случаях.

Я хочу иметь возможность передать значение и вернуть ему все идентификаторы, которые имеют это значение в диапазоне. Первоначально я думал, что работал, когда пытался: where start >= '7505017' and end <= '7505017'.

Когда я попытался сделать where start >= '1420010' and end <= '1420010', он не возвращает никаких результатов, и он должен. В идеале я должен иметь возможность искать любую ценность в этом диапазоне и возвращать значение. Я рисую пустое о том, почему у меня проблема.

Я пробовал заполнять начало пробелами и концом с помощью Zs.

(start >= @org + '     ' and end <= @org + 'ZZZZZZZZZZZZZZZZZ') 

Что мне не хватает? Обратите внимание, что пользователь будет передавать только 7 цифр (которые будут контролироваться пользовательским интерфейсом).

+2

Сравнение строк ведут себя по-разному в числовыми. Как вы обрабатываете идентификаторы, начинающиеся с букв, как в строке ID = 2? Это «больше» или «меньше», чем 1, 2, 7 и т. Д.? – iamdave

+0

@MisterPositive В вопросе уже есть соответствующие части ('where' clauses). – iamdave

+0

RTrim (LTrim (Заменить (yourColumn '', ''))) Чтобы избавиться от пробелов и т. Д. Поскольку @iamdave заявлял, что сравнение символьных данных с числовыми данными отличается. –

ответ

1

Если я правильно понимаю ваши требования , это может быть столь же просто, как

Declare @YourTable table (id int,start varchar(50),[end] varchar(50)) 
Insert into @YourTable values 
(1,'1420010','1421011'), 
(2,'B420010','B421011'), 
(3,'1420010','1422011'), 
(4,'7505017','7505017') 

Declare @Org varchar(50) = '1420010' 

Select * 
From @YourTable 
Where @Org between Start and [End] 

Возвращает

id start end 
1 1420010 1421011 
3 1420010 1422011 
+0

Это по существу то, что OP делает уже и не работает для них по причинам, изложенным в комментариях ... – iamdave

+0

По какой-то причине это работает. Даже с Bs и Ms. –

+0

@iamdave Нет, это не то, что делает OP. Неудивительно, что он работает для него, –

0

Если вы уверены в своих данных, вы можете просто преобразовать части, которые вам нужны, int и перейти оттуда. Если вы игнорируете ваше B...... значения на данный момент, вы можете сделать что-то вроде:

declare @a table(id int, s nvarchar(50), e nvarchar(50)); 

insert into @a values 
(1,'1420010','421011') 
,(2,'B420010','B421011') 
,(3,'1420010','1422011') 
,(4,'7505017','7505017') 

select * 
from @a 
where case when isnumeric(s) = 1 
      then cast(s as int) 
      else null 
      end >= 1420010 
    and case when isnumeric(e) = 1 
      then cast(e as int) 
      else null 
      end <= 1421020; 
0

Поскольку вы хотите взглянуть на только числовых, вы можете использовать:

DELCARE @org INT = 1421011 
WHERE TRY_CONVERT(INT,start) >= @org AND TRY_CONVERT(INT,end) <= @org 
+0

Поскольку доступно 'try_convert', это превосходное решение для поиска числовых диапазонов. – iamdave

0

Начнём с легким

select top (100) id, start, len(start), end, len(end) 
from table 
order by id asc 

select top (100) id, start, len(start), end, len(end) 
from table 
order by id desc 

select top (100) id, start, len(start), end, len(end) 
from table 
where ltrim(start) = '1420010' 
order by id asc 

select top (100) id, start, len(start), end, len(end) 
from table 
where ltrim(start) >= '1420010' 
order by id asc 
Смежные вопросы