2015-07-03 4 views
0

У меня есть данные, содержащие следующие строки, как:Выберите только строки, содержащие цифры

Hello | World | 40 
Hi | World | 24244 
One | Two | 27 
This | That | 84f 
Yes | No | 456gf 
The | Test|54 

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

Hello | World | 40 
Hi | World | 24244 
One | Two | 27 
The | Test|54 

Я пробовал несколько подходов с использованием подстановочных знаков, но не с успехом.

TB LIKE '%_|_[0-9]%' OR TB LIKE '%_|[0-9]%' 
AND TB NOT LIKE '%[0-9][^a-z]%' 

и так далее. Очевидно, например, например. этот запрос возвращает также строки, содержащие 456gf и 84f.

+0

Если вы хотите, чтобы убедиться, что последний символ является числом, а не письмо, то вы можете использовать 'IsNumeric (правая (строка, 1)) = 1' или вы можете проверить весь подстрока после последней трубы. Имейте в виду, что isnumeric возвращает true для некоторых символов (+ - $ для примера) – jpw

+1

@jpw - OP может даже использовать 'TB LIKE '% [0-9]'' как способ проверки последнего символа строки, которая должна быть int int без querks 'isnumeric' – ughai

+0

@ughai Ah, справа. Это было бы лучше. – jpw

ответ

0

Я думаю, что вы почти там. Я не уверен, если вы имеете в виду _ или пробел в своем шаблоне. Я думаю, что основная проблема заключается в том, что трюк «НЕ ^» работает не так, как ожидалось. Вы действительно хотите, чтобы он применился к последнему разделу.

Попробуйте это как ваш WHERE ...

LTRIM(REVERSE(SUBSTRING(REVERSE(TB),1,CHARINDEX('|',REVERSE(TB)) - 1))) NOT LIKE '%[^0-9]%' 
0

попробовать с КТР,

declare @t table (field1 varchar(20),field2 varchar(20),field3 varchar(20)) 
insert into @t 
     (field1, field2, field3) 
values ('Hello','World','40') 
     ,('Hi', 'World','24244') 
     ,('One','Two','27') 
     ,('This', 'That','84f') 
     ,('Yes','No','456gf') 
     ,('The','Test','54') 
;with cte as(
select *, CASE ISNUMERIC(field3) WHEN 1 THEN CAST(field3 AS int) ELSE null end as Field4 
from @t) 
SELECT cte.field1,cte.field2,cte.field3 FROM cte 
where field4 is not null 
0

использование try_parse InstEd из IsNumeric, потому что это быстрее, чем ISNUMERIC.

declare @t table (field1 varchar(20),field2 varchar(20),TB varchar(20)) 
insert into @t 
     (field1, field2, TB) 
values ('Hello','World','40') 
     ,('Hi', 'World','24244') 
     ,('One','Two','27') 
     ,('This', 'That','84f') 
     ,('Yes','No','456gf') 
     ,('The','Test','54') 
; 
Select * from @t 
WHERE TRY_PARSE(Tb as int) IS NOT NULL 
0

Это должно соответствовать вашим требованиям (таблица называется т, колонка с):

select * from t where isnumeric(substring(c, charindex('|', c, charindex('|', c, 0) + 1) + 1, len(c))) = 1 

Внутренний CHARINDEX charindex('|', c, 0) находит позицию первого символа трубы, наружный один находит позицию второй, потому что он начинает поиск позади первого. После этого, isnumeric проверяет, действительно ли остаток является числом. Для теста:

declare @t table(c varchar(100)) 
insert into @t (c) values 
(' Hello | World | 40'), 
('Hi | World | 24244'), 
('One | Two | 27 '), 
('This | That | 84f '), 
('Yes | No | 456gf '), 
('The | Test|54  ') 

select charindex('|', c, charindex('|', c, 0) + 1), charindex('|', c, 0) from @t 
select * from @t where isnumeric(substring(c, charindex('|', c, charindex('|', c, 0) + 1) + 1, len(c))) = 1 
Смежные вопросы