Home > Blockchain >  Sum of digits in string SQL
Sum of digits in string SQL

Time:05-14

Suppose I have column with strings with digits and non-digits. For example 1a2b~#3c. How can I find sum of the digits in these strings. I can't use CTE and my query should begin with SELECT

CodePudding user response:

Using an inline numbers table (use a permanent table if possible though with as many rows as the largest possible string), I would solve this as follows:

declare @string varchar(50)='1a24b~0#3c1'

select Sum(n) 
from (select @string s)s
cross apply(
    select Try_Convert(int,Substring(s,p,1))
    from (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15))x(p)
    where p <= Len(s) and Ascii(Substring(s,p,1)) between 49 and 57
)x(n)

CodePudding user response:

Here is my version. Looks pretty similar to the one Stu posted.

select sum(try_convert(int, MyNum))
from
(
    select MyNum = substring(x.y, t.n, 1)
    from (values('1a2b~#3c'))x(y)
    join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))t(n) on t.n <= len(x.y)
) t

If you are on an older version of sql server before try_convert you could modify this slightly to something like this.

select sum(convert(int, MyNum))
from
(
    select MyNum = substring(x.y, t.n, 1)
    from (values('1a2b~#3c'))x(y)
    join (values(1),(2),(3),(4),(5),(6),(7),(8),(9),(10))t(n) on t.n <= len(x.y)
    where substring(x.y, t.n, 1) like '[0-9]'
) t

CodePudding user response:

And here's the non-boring version using STRING_SPLIT. Of course for "non-boring" you may read "overengineered" as well, depending on your preference.

declare @s varchar(50) = '1a2b~#3c';

select sum(c)
from (values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9')) v(n)
cross apply (
    select c = count(*) * n - n 
    from string_split(@string, n)
) _

Unlike the other solutions, the VALUES clause here is not a tally table and it will work for strings of any length (though it becomes fantastically inefficient for long strings with many digits, but that's almost certainly true of any solution that has to stick to pure T-SQL). If CROSS APPLY and/or VALUES are considered too advanced, it's also trivial to rewrite this as a sum of 10 repeated clauses.

  • Related