TSQL - добавление каждой цифры в переменную - PullRequest
0 голосов
/ 23 апреля 2019

Есть ли простой способ добавить каждую цифру в целочисленную переменную или у меня есть цикл за цифрой. Допустим, у переменной есть ряд чисел:

|Digit_tbl| 690644694

Результат:

|Digit_tbl| 48

Ответы [ 2 ]

2 голосов
/ 23 апреля 2019

Одним из способов сделать это является использование рекурсивного cte:

declare @num int = 690644694;


with cte as (
    select @num as num, @num % 10 as digit 
    union all
    select num / 10, num / 10 % 10
    from cte
    where num > 0
)

SELECT SUM(digit)
FROM cte

Результат: 48

Другой вариант, который, вероятно, должен иметь лучшую производительность (не то, что его можно измеритьдля единственного целого) - использовать десятичные числа cte:

declare @num int = 690644694;

With Tally as
(
    SELECT TOP 10 POWER(10, (ROW_NUMBER() OVER(ORDER BY @@SPID))-1) As n
    FROM sys.objects
)

SELECT SUM(@num / n % 10)
FROM Tally
WHERE n <= @num

(максимальное значение int на сервере sql имеет 10 цифр - отсюда top 10 - значения в tally cte1, 10, 100, .... 1000000000)

2 голосов
/ 23 апреля 2019

Целочисленное деление и оператор по модулю могут быть использованы для извлечения каждой цифры из целого числа:

SELECT number, SUM(number / divisor % 10) AS digitsum
FROM (VALUES
    (690644694),
    (2147483647)
) AS t(number)
INNER JOIN (VALUES
    (1),
    (10),
    (100),
    (1000),
    (10000),
    (100000),
    (1000000),
    (10000000),
    (100000000),
    (1000000000)
) AS x(divisor) ON divisor <= number
GROUP BY number
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...