如何拆分点分隔的多ID字符串并按行号筛选?
拆分多分隔符ID字符串并按行号筛选的解决方案
你提到的PARSENAME()函数确实有局限性——它最多只能处理包含3个英文句号(即4个分段)的字符串,所以没法拆分更长的ID序列。另外你的原始字符串里还混了一个空格,得先把空格替换成句号,统一分隔符。
下面提供两种可行的方法:
方法一:使用STRING_SPLIT() + ROW_NUMBER()(SQL Server 2016及以上版本适用)
这是最简洁的方案,直接拆分字符串并给每条记录加行号,方便按行筛选:
DECLARE @IdString NVARCHAR(MAX) = '4400028285.4400043238.4400051619.4400052460.4400074441.4400124290.4400131680.4400137443 4400140030.4400141964.4400143906.4400143906.4400144145.4400149146'; -- 先把字符串里的空格替换成句号,统一分隔符 SET @IdString = REPLACE(@IdString, ' ', '.'); -- 拆分字符串、添加行号,按需筛选指定行 SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS RowNum, value AS Id FROM STRING_SPLIT(@IdString, '.') WHERE value <> '' -- 排除连续分隔符产生的空值 -- 要筛选第6行的话,加上这句:AND RowNum = 6
方法二:递归CTE(适用于SQL Server 2016之前的旧版本)
如果你的SQL Server版本不支持STRING_SPLIT(),可以用递归CTE来拆分:
DECLARE @IdString NVARCHAR(MAX) = '4400028285.4400043238.4400051619.4400052460.4400074441.4400124290.4400131680.4400137443 4400140030.4400141964.4400143906.4400143906.4400144145.4400149146'; -- 替换空格+末尾加句号,方便递归处理 SET @IdString = REPLACE(@IdString, ' ', '.') + '.'; WITH SplitCTE AS ( SELECT CAST(LEFT(@IdString, CHARINDEX('.', @IdString) - 1) AS NVARCHAR(MAX)) AS Id, CAST(SUBSTRING(@IdString, CHARINDEX('.', @IdString) + 1, LEN(@IdString)) AS NVARCHAR(MAX)) AS RemainingString, 1 AS RowNum WHERE @IdString <> '' UNION ALL SELECT CAST(LEFT(RemainingString, CHARINDEX('.', RemainingString) - 1) AS NVARCHAR(MAX)) AS Id, CAST(SUBSTRING(RemainingString, CHARINDEX('.', RemainingString) + 1, LEN(RemainingString)) AS NVARCHAR(MAX)) AS RemainingString, RowNum + 1 AS RowNum FROM SplitCTE WHERE RemainingString <> '' ) SELECT RowNum, Id FROM SplitCTE WHERE Id <> '' -- 筛选第6行的话,加上这句:AND RowNum = 6 OPTION (MAXRECURSION 0); -- 处理超过100条ID的情况,解除递归次数限制
如果你的ID列表里有重复值(比如原字符串里的4400143906出现两次),可以根据需求添加DISTINCT关键字去重。
内容的提问来源于stack exchange,提问作者Sivamohan Reddy
相关产品推荐
相关产品推荐

