在mysql中对一个数字的位数求和

wvt8vs2t  于 2023-11-16  发布在  Mysql
关注(0)|答案(2)|浏览(104)

我有一个从数学计算中返回一个整数的查询。我需要对这个整数中的所有数字求和。
就像这样:

select sumdigits(number) from dual
-- if number =123, output: 1+2+3 = 6 
-- if number =100, output: 1+0+0 = 1

字符串

ej83mcc0

ej83mcc01#

我想使用Fiddle或Rextester测试这个,但现在都不工作。所以,你的赞成/反对票将作为测试:

SELECT CAST(SUBSTRING(number, 1, 1) AS UNSIGNED) +              -- first digit
       CAST(SUBSTRING(number, 2, 1) AS UNSIGNED) +              -- second digit
       CAST(SUBSTRING(number, 3, 1) AS UNSIGNED) AS the_sum     -- third digit
FROM yourTable

字符串
这假设一个最大宽度为3位的数字,也是零填充的(正如你提到的,我们可以假设)。
如果你真的需要在生产中这样做,你可能应该创建一个用户定义的函数来处理这样的操作,边缘情况等。

更新:

根据@ThorstenKettner的评论,我们可以通过为每个数字位置添加更多项来将这个答案推广到 any 长度的number字段。例如,如果我们想覆盖最多四位数宽的数字,我们可以添加以下项:

+ CAST(SUBSTRING(number, 4, 1) AS UNSIGNED)


如果存在,则其将增加一个数,或者如果不存在,则其将增加零。

a64a0gku

a64a0gku2#

我都不好意思提这个建议但是...

SELECT
    foo,
    CHAR_LENGTH(
        REPLACE(
            REPLACE(
                REPLACE(
                    REPLACE(
                        REPLACE(
                            REPLACE(
                                REPLACE(
                                    REPLACE(
                                        REPLACE(
                                            REPLACE(
                                                REPLACE(foo, '-', ''),
                                            '0', ''),
                                        '1', '1'),
                                    '2', '22'),
                                '3', '333'),
                            '4', '4444'),
                        '5', '55555'),
                    '6', '666666'),
                '7', '7777777'),
            '8', '88888888'),
        '9', '999999999')
    ) AS digit_sum
FROM (
     SELECT 123 AS foo
     UNION ALL SELECT 100
     UNION ALL SELECT 413432143
     UNION ALL SELECT -6301
     UNION ALL SELECT 1234567890
) x

个字符
将其重写为函数可能更有意义,同时进行一些错误检查以返回浮点数或类似的NULL

相关问题