Sql server 在有连续数字的情况下使用SQL进行筛选

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中,我可以使用正则

正在尝试将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中,我可以使用正则表达式执行以下操作:

从文件名为~'\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非常正确!