SQL中实现数字反转与各位数字求和及表字段计算需求
解决SQL中数字反转与各位之和计算的问题
嘿,刚好碰到过类似的需求,我来给你详细拆解怎么实现!针对你那张包含decimal(18,0)类型列A的表,咱们可以通过字符串转换+内置函数轻松生成列B(数字反转)和列C(各位之和),下面直接上方案:
1. 实现数字反转(列B)
因为SQL里的反转函数REVERSE是针对字符串的,所以咱们先把decimal类型的列A转换成字符串,反转后再转回decimal就行,完美适配你的需求:
CAST(REVERSE(CAST(A AS VARCHAR(18))) AS DECIMAL(18,0)) AS B
- 第一步
CAST(A AS VARCHAR(18)):把decimal类型的数字转成字符串,方便用REVERSE处理 - 第二步
REVERSE(...):反转字符串内容 - 第三步
CAST(...) AS DECIMAL(18,0):把反转后的字符串转回原数据类型,保证列B和列A类型一致
2. 计算各位数字之和(列C)
这里分两种常见场景给你方案,优先用更简洁的版本:
方案一:用STRING_SPLIT(SQL Server 2016+ 或支持字符串拆分的数据库)
把列A转成字符串后拆分成单个字符,再转成数字求和:
(SELECT SUM(CAST(value AS INT)) FROM STRING_SPLIT(CAST(A AS VARCHAR(18)), '')) AS C
STRING_SPLIT(CAST(A AS VARCHAR(18)), ''):把数字字符串按空字符拆分,得到每一位的字符SUM(CAST(value AS INT)):把每个字符转成整数后求和,就是各位数字的总和
方案二:递归CTE(兼容老版本SQL Server或不支持STRING_SPLIT的数据库)
如果你的数据库版本比较老,用递归的方式逐个提取每一位数字相加:
( WITH RecursiveSum AS ( SELECT A AS OriginalNum, A % 10 AS Digit, A / 10 AS RemainingNum, CAST(A % 10 AS INT) AS SumSoFar FROM YourTable WHERE A > 0 UNION ALL SELECT OriginalNum, RemainingNum % 10 AS Digit, RemainingNum / 10 AS RemainingNum, SumSoFar + (RemainingNum % 10) AS SumSoFar FROM RecursiveSum WHERE RemainingNum > 0 ) SELECT MAX(SumSoFar) FROM RecursiveSum WHERE OriginalNum = A ) AS C
这个递归会不断提取最后一位数字累加,直到剩余数字为0,最后取最大值就是总和。
完整SQL示例
假设你的表名叫YourTable,把上面的逻辑整合起来,完整语句如下:
SELECT A, CAST(REVERSE(CAST(A AS VARCHAR(18))) AS DECIMAL(18,0)) AS B, (SELECT SUM(CAST(value AS INT)) FROM STRING_SPLIT(CAST(A AS VARCHAR(18)), '')) AS C FROM YourTable;
测试你给出的样本数据(34、123、345、879),得到的结果完全符合你的预期:
| A | B | C |
|---|---|---|
| 34 | 43 | 7 |
| 123 | 321 | 6 |
| 345 | 543 | 12 |
| 879 | 978 | 24 |
如果是MySQL、PostgreSQL等其他数据库,核心逻辑一样,只是函数细节略有调整(比如MySQL用CHAR代替VARCHAR,字符串拆分用其他方式),你可以根据自己的数据库类型微调。
内容的提问来源于stack exchange,提问作者Biddut
相关产品推荐
相关产品推荐

