[英]SQL Server extract integers from string using regular expression
我有一個字符串(unc文件路徑),我需要提取一些將以半可預測方式嵌入到字符串中的整數。
字符串示例:
\\servername\folder1\FTP\folder2\512/862450_FileBundle.zip
--OR-- : \\servername\folder1\FTP\folder2\512\862450_FileBundle.zip
--OR-- : servername/folder1/FTP/folder2/512/862450_FileBundle.zip
以下正則表達式正則表達式將與以正斜杠或反斜杠界定的任何整數值匹配: (\\/|\\\\)\\d+(\\/|\\\\)
因此,上面的REGEX將與“ \\ 512 \\”,“ \\ 512 /”,“ / 512 /”甚至“ / 512 \\”匹配。
我嘗試了以下SQL和其他變體而沒有成功:
DECLARE @testString varchar(50) = '\\servername\folder1\FTP\folder2\512/862450_FileBundle.zip'
SELECT PATINDEX('%(\/|\\)\d+(\/|\\)%', @testString)
我對REGEX和SQL並不十分熟悉,所以我什至不確定這是否可行。
SQL Server不具備正則表達式那么好的模式匹配功能。 您可以搜索模式:
[/\\][0-9]%[/\\]
也就是說,斜杠后跟一個數字,后跟任何其他字符串,后跟一個斜杠。 這將匹配第一個數字之后的任何字符,但是您的示例沒有任何形式為/1abc/
。
如果這足夠了,那就可以了:
select v.*,
left(v2.str2, patindex('%[/\\]%', v2.str2) - 1)
from (values ('\\servername\folder1\FTP\folder2\512/862450_FileBundle.zip')) v(str) cross apply
(values (stuff(v.str, 1, patindex('%[/\\][0-9]%[/\\]%', v.str), ''))) v2(str2)
除了編寫UDF以遍歷字符外,我唯一想到的就是蠻力方法...
(用戶定義函數可能是最差的選擇。)
https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=face1befe5e7c74f457846fc37eca649
SELECT
*,
SUBSTRING(test.unc_file_path, headMatch.pos+1, headMatch.chars)
FROM
test
OUTER APPLY
(
SELECT
MIN(pos), MIN(chars)
FROM
(
SELECT
PATINDEX('%' + head + body + tail + '%', test.unc_file_path) AS pos, chars
FROM
(
SELECT '\'
UNION ALL SELECT '/'
)
head(head)
CROSS JOIN
(
SELECT 1, '[0-9]'
UNION ALL SELECT 2, '[0-9][0-9]'
UNION ALL SELECT 3, '[0-9][0-9][0-9]'
UNION ALL SELECT 4, '[0-9][0-9][0-9][0-9]'
UNION ALL SELECT 5, '[0-9][0-9][0-9][0-9][0-9]'
)
body(chars, body)
CROSS JOIN
(
SELECT '\'
UNION ALL SELECT '/'
)
tail(tail)
)
match
WHERE
pos > 0
)
headMatch(pos, chars)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.