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

如何高效查询给定数字的各位数字之和?

计算数字各位之和的高效解法

当然能实现数字各位之和的计算啦!你提到的用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:12:30