2016-10-04 65 views
0

我想用{數值模式字符串} .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查詢甚至導致這些類型的文件

 
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,對於一些字符不是數字,如加號(+),減號( - ),和有效的貨幣符號,如美元符號( $)。

處理與複式.字符的文件名,如果總是有一個.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

你不能真正做你正在嘗試使用普通的開箱即用SQL做什麼。 reason you are seeing those results%字符匹配任何字符,任意次數。它不像*在正則表達式中匹配前面的字符0次或更多次。

你最好的選擇可能是創建一些實現SQL Server端的正則表達式功能的CLR函數。你可以看看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