Нужна помощь Суммирование только чисел в столбце, который содержит специальные символы и цифры в оракуле - PullRequest
0 голосов
/ 23 сентября 2019
Name Text
a      0
b      1
c      3
d      8
e      !
f      "
g      a
h      h
i      9

Select name, Sum(Text)
from
(select name, to_number(Text) Text
from Table_Name)

group by name

Я получаю недопустимый код ошибки числа при запуске этого на помощнике оракула. ​​

Я использую Oracle 11.2.0.3.0

Ответы [ 2 ]

1 голос
/ 23 сентября 2019

Какая версия Oracle?В 12.2 или более поздних версиях вы можете

select name, sum( to_number( text default 0 on conversion error ))
  from your_table
 group by name;

. В более ранних версиях я обычно предпочитаю что-то вроде

create or replace function safe_to_number( p_str in varchar2 )
  return number
is
  l_ret number;
begin
  l_ret := to_number( p_str );
  return l_ret;
exception
  when others then
    return null;
end;

select name, safe_to_number( text )
  from your_table
 group by name

Решения на основе регулярных выражений, которые ищут числа, могут работать, но они, как правило, усложняются.быстро.«1,00» может быть числом (при условии, что десятичный разделитель - это точка), «1,00,00» - нет, «-100» - это число, «1-00» - нет, и т. Д. Обычно вы можете играть с регулярным выражением.какое-то время, чтобы он работал с любыми имеющимися у вас данными, но трудно быть уверенным, что вы рассмотрели каждый случай.Если вы решите, что хотите обрабатывать особые случаи по-другому (то есть, у вас есть индийские пользователи, которые вводят сто тысяч как 1 000 000), вы можете обновить функцию, чтобы выполнить итерацию серии масок формата, прежде чем отказаться от преобразования.

0 голосов
/ 23 сентября 2019

Regexp_like может помочь вам решить, какие текстовые значения являются действительными числами;как то так:

SQL> with test (name, text) as
  2    (select 'a', '0' from dual union all
  3     select 'b', '1' from dual union all
  4     select 'c', '3' from dual union all
  5     select 'd', '8' from dual union all
  6     select 'g', 'a' from dual union all
  7     select 'i', '9' from dual
  8    )
  9  select sum(text)
 10  from test
 11  where regexp_like(text, '^\d+$');

 SUM(TEXT)
----------
        21

SQL>
...