2015-11-26 2 views
0

У меня есть следующая проблема: есть таблица с данными столбца (тип - nvarchar), этот столбец может содержать любые символы, мне нужны только данные, которые являются числами или диапазоном чисел, но игнорировать белые пробелы. Например:Регулярное выражение в T-SQL

declare @tmp table (data nvarchar(192), Result nvarchar(192)); 

insert into @tmp SELECT '123', '<- valid'; 
insert into @tmp SELECT ' 123 ', '<- valid'; 
insert into @tmp SELECT '123-123', '<- valid'; 
insert into @tmp SELECT ' 123 - 123 ', '<- valid'; 
insert into @tmp SELECT '123jmj', '<- invalid'; 
insert into @tmp SELECT '123,5441', '<- invalid'; 
insert into @tmp SELECT '123,yjyj', '<- invalid'; 

SELECT * FROM @tmp 

Набор данных результатов должен содержать только допустимые строки. Я могу попробовать следующие

SELECT * FROM @tmp WHERE data NOT LIKE '%[^0-9]%' 

Но у меня есть только первый ряд.

+0

Как Regex-подобной функциональности вы можете увидеть довольно ограниченным, как насчет некоторых альтернатив? Более ранние версии (2005+) имеют функцию 'ISNUMERIC()', а более новые (2012+) вы можете использовать 'TRY_PARSE()'. – Bridge

+0

Вы можете использовать LTRIM (RTRIM (data)) ', который также даст вашу вторую строку. Для диапазона вам нужно будет добавить условие 'OR' к вашему' WHERE', это не должно быть слишком сложно, но вам может потребоваться «ЗАМЕНИТЬ» пробелы внутри значения. – HoneyBadger

+1

@Bridge, 'ISNUMERIC' очень ненадежный, денежные знаки и арифметические знаки также оцениваются как истинные. 'TRY_PARSE' не будет работать для диапазонов. – HoneyBadger

ответ

2

Сначала замените white spaces с empty string

Следующая заменить - с .

Третье использование ParseName трюк для разделения данных.

После разделения можно фильтровать записи с помощью NOT LIKE '%[^0-9]%'

SELECT data 
FROM (SELECT *, 
       Parsename(Replace(Replace(data, ' ', ''), '-', '.'), 2) st, 
       Parsename(Replace(Replace(data, ' ', ''), '-', '.'), 1) ed 
     FROM @tmp) a 
WHERE st NOT LIKE '%[^0-9]%' 
     OR ed NOT LIKE '%[^0-9]%' 
+0

Это работает, по крайней мере, с образцовыми данными. Не могли бы вы немного расширить, как это работает? – HoneyBadger

+0

Parsename предназначен только для sql +2012 –

+1

@JuanCarlosOropeza - Пожалуйста, обратитесь к этой ссылке. Это работает с '2005' –

Смежные вопросы