Sql server 在有连续数字的情况下使用SQL进行筛选
正在尝试将PostgreSQL视图转换为SQL Server(2016)视图 我有一个名为filename的列的表,其中包含以下数据:Sql server 在有连续数字的情况下使用SQL进行筛选,sql-server,Sql Server,正在尝试将PostgreSQL视图转换为SQL Server(2016)视图 我有一个名为filename的列的表,其中包含以下数据: R24bMP1.png MP3.png R28.jpg I002.jpg App_1472669569054.jpg 测试_1575753047890.png 因此,我喜欢过滤文件名必须包含13个连续数字的所有行,在示例中,仅App_1472669569054.jpg和Test_157575753047890.png 在PostgreSQL中,我可以使用正则
- R24bMP1.png
- MP3.png
- R28.jpg
- I002.jpg
- App_1472669569054.jpg
- 测试_1575753047890.png
App_1472669569054.jpg
和Test_157575753047890.png
在PostgreSQL中,我可以使用正则表达式执行以下操作:
从文件名为~'\d{13}'的表中选择*
已在SQL Server中尝试使用:
从文件名为“%[0-9]{13}%”的表中选择*
,但未得到任何结果。唯一有效的方法是:
从文件名为“%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]”的表中选择*。
之后,我只需要获取文件名的数字部分,在本例中,返回值必须为:
- 1472669569054
- 1575753047890
我知道我可以在SQL Server中使用CLR,但我想知道在这种情况下是否可以不使用CLR进行过滤。正如Martin Smith所指出的:
'%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'
可简化为:
'%' + replicate('[0-9]',13) + '%'
你大部分时间都在那里:
declare @filename varchar(128) = 'Test_1575753047890.png'
select test=substring(@filename
,patindex('%' + replicate('[0-9]',13) + '%',@filename)
,13
)
返回:1575753047890
因此,对于您的桌子,它看起来像:
select test=substring([filename]
,patindex('%' + replicate('[0-9]',13) + '%',[filename])
,13
)
from t
where patindex('%' + replicate('[0-9]',13) + '%',[filename]) > 0
或者
patindex('%'+REPLICATE('[0-9]',13)+'%',@filename)
更简洁一些。@MartinSmith非常正确!