我想搜索一个包含{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
任何人都可以帮助我,我在这里失踪了。
答案 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
正如@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