You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:09:50