SSMS 2016字符串提取问题:匹配特定位置数字求助
解决SSMS 2016中特定格式字符串的提取需求
问题1:提取两个_之间的第一个纯数字
你的PATINDEX返回0是因为SQL Server的PATINDEX不支持正则表达式的+量词,它仅支持有限通配符(%、_、[]),无法识别[0-9]+这种语法。要匹配一个或多个数字,需用[0-9][0-9]*替代。
以下是可行的提取代码:
DECLARE @InputString VARCHAR(MAX) = '14Jan22_B_15May23_15_N_323_412_102'; -- 定位第一个被_包裹的纯数字段的起始位置(跳过开头的_) DECLARE @StartPos INT = PATINDEX('%_[0-9][0-9]*_%', @InputString) + 1; -- 定位该数字段末尾的_位置 DECLARE @EndPos INT = CHARINDEX('_', @InputString, @StartPos); -- 提取目标数字 SELECT SUBSTRING(@InputString, @StartPos, @EndPos - @StartPos) AS First_Pure_Number;
执行后会返回示例中的15。
问题2:提取第一项数字之后_N_或_R_后的所有数字
基于问题1的结果,我们可以先定位_N_或_R_的位置(在第一个纯数字之后),再提取后续的所有数字段:
方法1:合并所有数字为单个字符串
DECLARE @InputString VARCHAR(MAX) = '14Jan22_B_15May23_15_N_323_412_102'; -- 先获取第一个纯数字的结束位置 DECLARE @FirstNumStart INT = PATINDEX('%_[0-9][0-9]*_%', @InputString) + 1; DECLARE @FirstNumEnd INT = CHARINDEX('_', @InputString, @FirstNumStart); -- 定位_N_或_R_的位置 DECLARE @MarkerPos INT = PATINDEX('%[_](N|R)[_]%', @InputString, @FirstNumEnd); -- 跳转到标记后的第一个数字起始位置 SET @MarkerPos = CHARINDEX('_', @InputString, @MarkerPos + 1) + 1; -- 提取并合并所有数字(去除_分隔符) SELECT REPLACE(SUBSTRING(@InputString, @MarkerPos, LEN(@InputString) - @MarkerPos + 1), '_', '') AS Merged_Numbers;
执行后返回323412102。
方法2:拆分每个数字为单独行(需SQL Server 2016+)
利用STRING_SPLIT函数拆分分隔的数字:
DECLARE @InputString VARCHAR(MAX) = '14Jan22_B_15May23_15_N_323_412_102'; DECLARE @FirstNumStart INT = PATINDEX('%_[0-9][0-9]*_%', @InputString) + 1; DECLARE @FirstNumEnd INT = CHARINDEX('_', @InputString, @FirstNumStart); DECLARE @MarkerPos INT = PATINDEX('%[_](N|R)[_]%', @InputString, @FirstNumEnd); SET @MarkerPos = CHARINDEX('_', @InputString, @MarkerPos + 1) + 1; -- 拆分并返回每个数字 SELECT value AS Individual_Numbers FROM STRING_SPLIT(SUBSTRING(@InputString, @MarkerPos, LEN(@InputString) - @MarkerPos + 1), '_');
执行后会返回三行结果:323、412、102。
内容的提问来源于stack exchange,提问作者Andrzej Lisowski
相关产品推荐
相关产品推荐

