2017-02-16 42 views
2

試圖將PostgreSQL視圖轉換爲SQL Server(2016)視圖。使用SQL WHERE LIKE在連續編號時進行篩選

我有一個表,一個名爲列名,數據如下:

  • 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]%'

在那之後,我需要得到僅文件名的數字部分,在本例中,返回的值必須是:

我知道我可以使用CLR與SQL Server,但我想知道如果可能在這種情況下過濾沒有CLR。

回答

4

正如馬丁·史密斯指出:

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

或'PATINDEX( '%' + REPLICATE( '[0-9]',13)+ '%',@文件名)'更簡潔一點。 –

+0

@MartinSmith非常真實! – SqlZim

+1

使用replicate()+1更容易在我的大腦中 –