SQL中搜索的正则表达式模式

时间:2016-10-04 18:52:26

标签: sql sql-server regex

我想搜索一个包含{Numerical Pattern String} .PDF文件名的表。

示例: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

任何人都可以帮助我,我在这里失踪了。

3 个答案:

答案 0 :(得分:0)

你可以使用简单的开箱即用sql来做你想要做的事情。 reason you are seeing those results%字符与任何字符匹配,任意次。它与正则表达式中的*不同,它与前一个字符匹配0次或更多次。

您最好的选择可能是创建一些在SQL Server端实现正则表达式功能的CLR函数。您可以查看at this link以找到一个好的起点。

答案 1 :(得分: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

答案 2 :(得分: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