我有一个从数学计算中返回一个整数的查询。我需要对这个整数中的所有数字求和。就像这样:
select sumdigits(number) from dual -- if number =123, output: 1+2+3 = 6 -- if number =100, output: 1+0+0 = 1
字符串
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字段。例如,如果我们想覆盖最多四位数宽的数字,我们可以添加以下项:
number
+ CAST(SUBSTRING(number, 4, 1) AS UNSIGNED)
型如果存在,则其将增加一个数,或者如果不存在,则其将增加零。
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。
NULL
2条答案
按热度按时间ej83mcc01#
我想使用Fiddle或Rextester测试这个,但现在都不工作。所以,你的赞成/反对票将作为测试:
字符串
这假设一个最大宽度为3位的数字,也是零填充的(正如你提到的,我们可以假设)。
如果你真的需要在生产中这样做,你可能应该创建一个用户定义的函数来处理这样的操作,边缘情况等。
更新:
根据@ThorstenKettner的评论,我们可以通过为每个数字位置添加更多项来将这个答案推广到 any 长度的
number
字段。例如,如果我们想覆盖最多四位数宽的数字,我们可以添加以下项:型
如果存在,则其将增加一个数,或者如果不存在,则其将增加零。
a64a0gku2#
我都不好意思提这个建议但是...
个字符
将其重写为函数可能更有意义,同时进行一些错误检查以返回浮点数或类似的
NULL
。