T-SQL如何从字符串提取隔位字符及指定起始位置的隔位字符
嘿,我来帮你搞定这两个T-SQL字符串提取的需求,这其实可以通过生成对应位置的数字序列,再配合字符串函数来实现,咱们一个个来看:
1. 从字符串中提取每隔一个的字符(默认从第1位开始)
要实现这个需求,核心思路是先生成和目标字符串长度一致的数字序列(代表每个字符的位置),然后筛选出所有奇数位置(1、3、5...)的字符,最后把这些字符拼接起来。
这里可以用CTE(公共表表达式)来生成数字序列,再结合SUBSTRING提取单个字符,STRING_AGG完成拼接:
DECLARE @inputStr VARCHAR(100) = '1050231'; WITH CharPositions AS ( SELECT 1 AS Pos UNION ALL SELECT Pos + 1 FROM CharPositions WHERE Pos < LEN(@inputStr) ) SELECT STRING_AGG(SUBSTRING(@inputStr, Pos, 1), '') AS Result FROM CharPositions WHERE Pos % 2 = 1; -- 筛选奇数位置,即每隔一个取第一个
运行这段代码,输入1050231的话,结果就是1521,和示例一致。
2. 从指定起始位置开始提取每隔一个的字符
这个需求是上面的进阶版,我们只需要调整筛选条件:找到所有大于等于起始位置,且(位置 - 起始位置)是偶数的位置(这样就能保证从起始位置开始,每隔一个取一个)。
同样用CTE实现,我们可以把起始位置做成变量,方便灵活调整:
DECLARE @inputStr VARCHAR(100) = '1050231'; DECLARE @startPos INT = 2; -- 这里可以改成1或者其他合法起始位置 WITH CharPositions AS ( SELECT 1 AS Pos UNION ALL SELECT Pos + 1 FROM CharPositions WHERE Pos < LEN(@inputStr) ) SELECT STRING_AGG(SUBSTRING(@inputStr, Pos, 1), '') AS Result FROM CharPositions WHERE Pos >= @startPos AND (Pos - @startPos) % 2 = 0; -- 保证从起始位置开始每隔一个取一个
- 当
@startPos = 1时,结果是1521,符合示例; - 当
@startPos = 2时,结果是003,和示例完全匹配。
小提示:如果你的SQL Server版本低于2017,STRING_AGG可能不支持,这时可以用FOR XML PATH的方式来拼接字符串,比如把SELECT部分换成SELECT SUBSTRING(@inputStr, Pos, 1) FROM CharPositions ... FOR XML PATH('')
内容的提问来源于stack exchange,提问作者Bobby Zimmerman
相关产品推荐
相关产品推荐

