如何高效查询给定数字的各位数字之和?
计算数字各位之和的高效解法
当然能实现数字各位之和的计算啦!你提到的用SUBSTR逐个截取字符再相加的方法确实可行,但它的局限性很明显:硬编码截取位置导致扩展性差(数字位数一变就得改代码),而且字符串操作在处理大量数据时效率也不如纯数字逻辑。结合你用DUAL表的情况,应该是在Oracle环境下,下面给你几个更优的方案:
方案1:纯数学运算(性能最优)
用取模和整除的逻辑逐个提取每一位数字,完全不需要字符串转换,是效率最高的方式:
-- 处理单个数字的情况 WITH single_num AS (SELECT 7369 AS empno FROM DUAL) SELECT SUM(MOD(TRUNC(empno / POWER(10, LEVEL - 1)), 10)) AS digit_sum FROM single_num CONNECT BY LEVEL <= LENGTH(TO_CHAR(empno));
如果要批量处理表中的EMPNO字段,只需要调整成下面的写法(避免递归产生重复行):
SELECT empno, SUM(MOD(TRUNC(empno / POWER(10, LEVEL - 1)), 10)) AS digit_sum FROM employees -- 替换成你的表名 CONNECT BY LEVEL <= LENGTH(TO_CHAR(empno)) AND PRIOR empno = empno AND PRIOR SYS_GUID() IS NOT NULL GROUP BY empno;
方案2:正则表达式拆分(代码更简洁)
如果更看重代码的可读性,用正则把数字拆成单个字符再求和也是不错的选择,代码更直观:
SELECT empno, SUM(TO_NUMBER(REGEXP_SUBSTR(TO_CHAR(empno), '\d', 1, LEVEL))) AS digit_sum FROM employees CONNECT BY LEVEL <= LENGTH(TO_CHAR(empno)) AND PRIOR empno = empno AND PRIOR SYS_GUID() IS NOT NULL GROUP BY empno;
关于你原始方案的小总结
你的原始代码:
SELECT SUBSTR('12345',1,1) + SUBSTR('12345',2,1) FROM DUAL;
适合已知固定位数的单个数字,但一旦位数变化或者需要批量处理,就会变得非常繁琐,而且字符串拼接的效率远不如纯数学运算,所以更推荐上面两种方案。
内容的提问来源于stack exchange,提问作者Giulio Angioli
相关产品推荐
相关产品推荐

