Как запросить сумму всех цифр в данном номере? - PullRequest
0 голосов
/ 11 мая 2018

Могу ли я запросить сумму всех цифр в данном числовом значении?

Пример входного значения:

  EMPNO 
  -----  
  7369

Я хочу получить это в результате:

 7+3+6+9 = 25

Я думал об этом решении, но не думаю, что оно эффективно:

SELECT SUBSTR('12345',1,1) + SUBSTR('12345',2,1)
FROM DUAL;

Ответы [ 4 ]

0 голосов
/ 11 мая 2018

Запрос динамических значений.

Declare @Num varchar(max)='54666', @Len int=1,@Total int=0
while @Len<=LEN(@Num)
begin
Set @Total=@Total+CONVERT(int,substring(@Num,@Len,1))
Set @Len=@len+1
end
select @Total

Просто измените значение @Num и попробуйте.

0 голосов
/ 11 мая 2018

Я не владею оракулом SQL, но это подход без преобразования в строку (что будет быстрее).В основном, делайте мод + деление, чтобы получить каждое другое число и добавлять их.

DECLARE testNumber integer := 123

SELECT
    testNumber,
    MOD(testNumber, POWER(10, 1)) +
        MOD(testNumber, POWER(10, 2)) / POWER(10, 1) +
        MOD(testNumber, POWER(10, 3)) / POWER(10, 2) +
        MOD(testNumber, POWER(10, 4)) / POWER(10, 3) +
        MOD(testNumber, POWER(10, 5)) / POWER(10, 4) +
        MOD(testNumber, POWER(10, 6)) / POWER(10, 5) +
        MOD(testNumber, POWER(10, 7)) / POWER(10, 6)
FROM
    DUAL

Придется добавлять суммы до максимального количества позиций, которые вы можете получить.

0 голосов
/ 11 мая 2018

Еще один подход, используя XMLTABLE

WITH t (s)
AS (
    SELECT REGEXP_REPLACE(7369, '(\d)', ',\1') 
    FROM DUAL
    )
SELECT sum(to_number(column_value))
FROM t
    ,xmltable(0||s)

Демо

Или решение на основе чистого PL / SQL, использующее операцию мода.

DECLARE 
    n INTEGER := 2562337328382; 
    s INTEGER := 0; 
BEGIN 
    WHILE n > 0 LOOP 
        s := s + MOD(n, 10); 
        n := floor(n / 10); 
    END LOOP; 
    dbms_output.put_line(s); 
END; 
/ 
54
0 голосов
/ 11 мая 2018

Вот решение:

1. Простой запрос

SELECT id,sum(SUBSTR(empno, LEVEL, 1 )) sums
FROM   (select 1 as id, 7369 as empno from DUAL)
      CONNECT BY LEVEL <= LENGTH(empno)
group by id

2. Использование CROSS JOIN

SELECT sum(column_value)
FROM   (
  SELECT 7369 val,
         ROWNUM AS id
  FROM dual
) t
CROSS JOIN
TABLE(
  CAST(
    MULTISET(
      SELECT SUBSTR( t.val, LEVEL, 1 )
      FROM   DUAL
      CONNECT BY LEVEL <= LENGTH( t.val )
    )
    AS SYS.ODCIVARCHAR2LIST
  )
) c

Выход:

SUM(COLUMN_VALUE)
25
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...