2016-10-04 5 views
0

Я хочу найти таблицу с именами файлов с {Numerical Pattern String} .PDF.Регулярный шаблон выражения для поиска в SQL

Пример: 1.pdf, 12.PDF, 123.PDF 1234.PDF и т.д .....

select * from web_pub_subfile where file_name like '[0-9]%[^a-z].pdf' 

Но выше SQL Query является в результате даже такого рода файлов

 
1801350 Ortho.pdf 
699413.processing2.pdf 
15-NOE-301.pdf 

Может ли кто-нибудь помочь мне в том, что мне здесь не хватает.

+0

LIKE синтаксис не является регулярным выражением: https: //msdn.microsoft.com/en-us/library/ms179859.aspx – Blorgbeard

ответ

0

Один из способов сделать это становится все подстроки перед расширением файла и проверка если он является числовым. Это решение работает только хорошо, если в имени файла есть только один символ ..

select * from web_pub_subfile 
where isnumeric(left(file_name,charindex('.',file_name)-1)) = 1 

Примечание:

IsNumeric возвращает 1 для некоторых символов, которые не являются числа, такие как плюс (+), минус (-), а также действующие валютные символы, такие как знак доллара ($).

Для обработки имен файлов с mutliple . символов и, если всегда есть .filetype расширение, используйте

select * from web_pub_subfile 
where isnumeric(left(file_name,len(file_name)-charindex('.',reverse(file_name)))) = 1 
and charindex('.',file_name) > 0 

Sample demo

Как было предложено @Blorgbeard в комментариях, чтобы избежать использования isnumeric, использование

select * from web_pub_subfile 
where left(file_name,len(file_name)-charindex('.',reverse(file_name))) NOT LIKE '%[^0-9]%' 
and len(left(file_name,len(file_name)-charindex('.',reverse(file_name)))) > 0 
+0

Спасибо, братан. Это работает для меня –

+0

@vkp Мои извинения, я этого не видел. удалить комментарий –

+0

@vkp Я не являюсь putz (я большой поклонник), попробуйте второй вариант с переменной таблицы, представленной ниже. –

0

Вы не можете действительно делать то, что вы пытаетесь сделать, используя plain из sql. reason you are seeing those results состоит в том, что символ % соответствует любому символу любое количество раз. Это не похоже на * в регулярное выражение, которое соответствует проницаемому символу 0 или более раз.

Ваш лучший вариант, вероятно, заключается в создании некоторых функций CLR, реализующих функциональные возможности регулярных выражений на стороне SQL Server. Вы можете посмотреть at this link, чтобы найти хорошее место для начала.

0

В зависимости от версии, если 2012+, вы можете использовать Try_Convert()

select * from web_pub_subfile where Try_Convert(int,replace(file_name,'.pdf',''))>0 



Declare @web_pub_subfile table (file_name varchar(100)) 
Insert Into @web_pub_subfile values 
('1801350 Ortho.pdf'), 
('699413.processing2.pdf'), 
('15-NOE-301.pdf'), 
('1.pdf'), 
('1234.pdf') 

select * from @web_pub_subfile where Try_Convert(int,replace(file_name,'.pdf',''))>0 

Возвращает

file_name 
1.pdf 
1234.pdf 
Смежные вопросы