SQL Server如何通过T-SQL按字母序列展开扩展表行数据
方案结论
你提到的转ASCII码运算后转回字符的思路完全可行,3000行的原始数据量不会产生明显性能问题,整个查询开销可以控制在毫秒级。
实现代码
以下是适配你场景的T-SQL实现,核心是通过递归CTE预生成A-Z的字母序列,再和原始区间表关联完成展开:
-- 替换为你的原始业务表 DECLARE @OriginalTable TABLE ( 编号 INT, 起始编码 VARCHAR(3), 结束编码 VARCHAR(3), 其他字段 NVARCHAR(100) ) INSERT INTO @OriginalTable VALUES (1, 'G0W', 'G0Z', '示例数据1'), (2, 'A1A', 'A1D', '示例数据2') -- 递归生成A-Z的字母序列 ;WITH LetterSeq AS ( SELECT ASCII('A') AS AsciiCode UNION ALL SELECT AsciiCode + 1 FROM LetterSeq WHERE AsciiCode < ASCII('Z') ) SELECT t.编号, t.其他字段, -- 拼接完整编码:前两位固定 + 区间内的第三位字母 LEFT(t.起始编码, 2) + CHAR(l.AsciiCode) AS 展开后编码 FROM @OriginalTable t INNER JOIN LetterSeq l ON CHAR(l.AsciiCode) >= RIGHT(t.起始编码, 1) AND CHAR(l.AsciiCode) <= RIGHT(t.结束编码, 1) ORDER BY t.编号, 展开后编码
扩展说明
如果你的编码规则更复杂(比如不止三位、或者前几位也存在区间变化),只需要把每一位的字符分别拆分,对应生成每一位的序列后拼接即可。比如要生成两位字母的全序列(AA~ZZ),只需要对字母序列做笛卡尔积:
;WITH LetterSeq AS ( SELECT ASCII('A') AS AsciiCode UNION ALL SELECT AsciiCode + 1 FROM LetterSeq WHERE AsciiCode < ASCII('Z') ) SELECT CHAR(a.AsciiCode) + CHAR(b.AsciiCode) AS TwoLetterCode FROM LetterSeq a CROSS JOIN LetterSeq b
关联逻辑和上面的示例一致,性能依然不会有明显损耗。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

