使用SQL WHERE LIKE过滤具有连续数字的时间

时间:2017-02-16 20:03:35

标签: sql-server

尝试将PostgreSQL视图转换为SQL Server(2016)视图。

我有一个名为filename的列表,其中包含以下数据:

  • R24bMP1.png
  • MP3.png
  • R28.jpg
  • I002.jpg
  • App_1472669569054.jpg
  • Test_1575753047890.png

所以,我喜欢过滤文件名必须包含13个连续数字的所有行,在本例中,只有App_1472669569054.jpgTest_1575753047890.png

在PostgreSQL中,我可以使用正则表达式来执行此操作:

SELECT * FROM table WHERE filename ~ '\d{13}'

在SQL Server中尝试: SELECT * FROM table WHERE filename LIKE '%[0-9]{13}%',但没有结果。唯一有效的方法是:

SELECT * FROM table WHERE filename LIKE '%[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

我知道我可以将CLR与SQL Server一起使用,但我想知道在这种情况下是否可以在没有CLR的情况下进行过滤。

1 个答案:

答案 0 :(得分:4)

正如马丁史密斯指出的那样:

<div class='select-widget'>
{{#each allContacts}}
    <div id='{{_id}}' class='select-widget-row {{#if selected}}selected{{/if}}'>
         {{fullname}}
    </div>
{{/each}}
</div>

可以简化为:

'%[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