在 SQL Server 中生成范围内的阿姆斯特朗数





5.00/5 (7投票s)
如何生成 0 到 999 之间的阿姆斯特朗数。
引言
虽然文章标题是阿姆斯特朗数生成,但其基本思想是展示数字表与递归 CTE 的结合概念。
本文面向不了解数字表、CTE 是什么以及如何有效地使用它们的组合编写复杂程序的人员。
背景
什么是阿姆斯特朗数?
如果一个数字各个位上数字的立方和等于该数字本身,那么它就是一个阿姆斯特朗数。
使用代码
数字表是一个只包含连续数字的表。它在许多情况下都很有帮助,尤其是在处理字符串操作时。有很多方法可以生成它们,但我将只关注使用递归 CTE 方法生成它们。
为此,我们可以这样做
WITH NumTab AS(
SELECT 1 AS Num UNION ALL SELECT Num+1 FROM NumTab WHERE Num <= 100)
SELECT * FROM NumTab
上面的程序将生成 1 到 100 之间的数字。
在生成阿姆斯特朗数的各种替代方法中,这里有一种方法:
WITH NumTab AS(
SELECT 0 AS Num UNION ALL SELECT Num+1 FROM NumTab WHERE Num < 999)
SELECT ArmstrongNumber = Num FROM NumTab
WHERE
Num = POWER(COALESCE(SUBSTRING(cast(Num AS VARCHAR(10)),1,1),0),3)
+ POWER(COALESCE(SUBSTRING(cast(Num AS VARCHAR(10)),2,1),0),3)
+ POWER(COALESCE(SUBSTRING(cast(Num AS VARCHAR(10)),3,1),0),3)
OPTION(MAXRECURSION 0)
输出
ArmstrongNumber
0
1
153
370
371
407
解释
首先,我生成一个数字表,然后从数字中提取各个位数。然后,我计算各个数字的立方和,并将其与原始数字进行比较,以查看它是否为阿姆斯特朗数。
关注点
该程序利用通过递归 CTE(SQL Server 2005 功能)创建的数字表。我欢迎任何帮助我改进文章的建议。