基于dbo.digits表构建含3次交叉连接的0-999带前导零字符序列
嘿,这就帮你搞定这个生成000到999带前导零数字字符串的SQL需求!
完整解决方案代码
我们通过三次自连接dbo.digits表(分别指定别名Hundreds、Tens、Units)生成所有百位、十位、个位的组合,再拼接成带前导零的三位字符串。这里有两种实现方式,你可以根据自己的SQL Server版本选择:
方式一:通用字符串拼接法(兼容所有SQL Server版本)
SELECT CharacterNumbersFromZeroTo999 = RIGHT('0' + CAST(Hundreds.n - 1 AS VARCHAR(1)), 1) + RIGHT('0' + CAST(Tens.n - 1 AS VARCHAR(1)), 1) + RIGHT('0' + CAST(Units.n - 1 AS VARCHAR(1)), 1) FROM dbo.Digits AS Hundreds CROSS JOIN dbo.Digits AS Tens CROSS JOIN dbo.Digits AS Units ORDER BY CharacterNumbersFromZeroTo999;
方式二:使用FORMAT函数(SQL Server 2012及以上版本)
这种方式代码更简洁易读:
SELECT CharacterNumbersFromZeroTo999 = FORMAT((Hundreds.n - 1) * 100 + (Tens.n - 1) * 10 + (Units.n - 1), '000') FROM dbo.Digits AS Hundreds CROSS JOIN dbo.Digits AS Tens CROSS JOIN dbo.Digits AS Units ORDER BY CharacterNumbersFromZeroTo999;
关键细节解释
- 三次CROSS JOIN:因为
dbo.digits有10行数据,三次笛卡尔积会生成10*10*10=1000行结果,正好覆盖000到999的所有三位数字组合。 - n-1的转换:由于
dbo.digits的n取值是1到10,我们用n-1把它转换成0到9的数字,这样才能生成从0开始的完整序列。 - 前导零处理:
- 方式一中,
RIGHT('0' + CAST(...) AS VARCHAR(1)), 1)确保每个数字都被格式化为1位字符串,哪怕是0也能保留为'0',拼接后自然形成三位带前导零的格式。 - 方式二中,
FORMAT(数值, '000')直接把0到999的数值格式化为三位字符串,自动补前导零,非常直观。
- 方式一中,
内容的提问来源于stack exchange,提问作者Xavier Maldonado
相关产品推荐
相关产品推荐

