Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
Определить сумму цифр в произвольной символьной строке.
Т.е. пользователь вводит строку какой то текст или предложение в котором есть цифры надо выдать сумму цифр в этом предложении.

Гуру форума, подскажите пожалуйста как это реализовать на Oracle SQL
22 окт 12, 18:58    [13358418]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
-2-
Member

Откуда:
Сообщений: 15330
если сумма не более 4000 и версия позволяет
length(regexp_replace(s, '(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|[^1-9]', '\1\2\2\3\3\3\4\4\4\4\5\5\5\5\5\6\6\6\6\6\6\7\7\7\7\7\7\7\8\8\8\8\8\8\8\8\9\9\9\9\9\9\9\9\9'))
22 окт 12, 19:16    [13358502]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
-2-,

Смотри стоит 11g.

Спасибо... попробую.
22 окт 12, 19:18    [13358508]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
-2-,

можете пояснить если не трудно в чем ошибка?
SELECT length(regexp_replace(&s, '(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|[^1-9]', '\1\2\2\3\3\3\4\4\4\4\5\5\5\5\5\6\6\6\6\6\6\7\7\7\7\7\7\7\8\8\8\8\8\8\8\8\9\9\9\9\9\9\9\9\9'))
FROM dual;
22 окт 12, 19:22    [13358531]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
Добрый Э - Эх
Guest
Текст ошибки нам предлагается угадать?
22 окт 12, 19:30    [13358575]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
Добрый Э - Эх
Guest
"Старообрядный" вариант:
select sum(substr(new_str,level,1)) as sum, max(str) as str, max(new_str) as only_digit
  from (
         select translate(str,'1'||translate(str,'~'||'~1234567890','~'),'1') as new_str, str
           from (
                  select 'vb3df1vcbc234w9ew' as str -- твоя строка с числами
                    from dual
                )
       )
connect by level <= length(new_str)
22 окт 12, 19:36    [13358599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
Добрый Э - Эх,

Error starting at line 1 in command:
length(regexp_replace(&s, '(1)|(2)|(3)|(4)|(5)|(6)|(7)|(8)|(9)|[^1-9]', '\1\2\2\3\3\3\4\4\4\4\5\5\5\5\5\6\6\6\6\6\6\7\7\7\7\7\7\7\8\8\8\8\8\8\8\8\9\9\9\9\9\9\9\9\9'))
Error report:
Unknown Command

код ошибки был такой...

попробую Ваш вариант, спасибо. Но он достаточно сложный... там еще фишка в том что это надо реализовать через простые функции... что просто раздражает
22 окт 12, 19:39    [13358612]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10042
ILIs544
подскажите пожалуйста как это реализовать на Oracle SQL


Если установлен OLAP option:

SQL> with t as (
  2             select 'vb3df1vcbc234w9ew' str from dual
  3            )
  4  select  str,
  5          trim('+' from regexp_replace(str,'\D+','+')) expr,
  6          dbms_aw.eval_number(trim('+' from regexp_replace(str,'\D+','+'))) val
  7    from  t
  8  /

STR               EXPR                        VAL
----------------- -------------------- ----------
vb3df1vcbc234w9ew 3+1+234+9                   247

SQL> 


SY.

Сообщение было отредактировано: 22 окт 12, 22:49
22 окт 12, 21:31    [13359048]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10042
11g:

SQL> with t as (
  2             select 'vb3df1vcbc234w9ew' str from dual
  3            )
  4  select  str,
  5          trim('+' from regexp_replace(str,'\D+','+')) expr,
  6          xmlcast(xmlquery(trim('+' from regexp_replace(str,'\D+','+')) returning content) as number) val
  7    from  t
  8  /

STR               EXPR                        VAL
----------------- -------------------- ----------
vb3df1vcbc234w9ew 3+1+234+9                   247

SQL>  


10g:

SQL> with t as (
  2             select 'vb3df1vcbc234w9ew' str from dual
  3            )
  4  select  str,
  5          trim('+' from regexp_replace(str,'\D+','+')) expr,
  6          extractvalue(xmltype(dbms_xmlgen.getxml('select ' || trim('+' from regexp_replace(str,'\D+','+')) || ' val from dual')),'ROWSET/ROW/VAL') val
  7    from  t
  8  /

STR               EXPR                 VAL
----------------- -------------------- ----------
vb3df1vcbc234w9ew 3+1+234+9            247

SQL> 


SY.
22 окт 12, 22:48    [13359362]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
ILIs544


попробую Ваш вариант, спасибо. Но он достаточно сложный... там еще фишка в том что это надо реализовать через простые функции... что просто раздражает


куда уж проще


select
length(a)-length(replace(a,'1',''))*1+
length(a)-length(replace(a,'2',''))*2+
length(a)-length(replace(a,'3',''))*3+
length(a)-length(replace(a,'4',''))*4+
length(a)-length(replace(a,'5',''))*5+
length(a)-length(replace(a,'6',''))*6+
length(a)-length(replace(a,'7',''))*7+
length(a)-length(replace(a,'8',''))*8+
length(a)-length(replace(a,'9',''))*9 as d
from(
	select 'asdasdasd1234278dfusdfh'  as a from dual
)z
22 окт 12, 22:51    [13359376]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
SY
SQL> with t as (
  2             select 'vb3df1vcbc234w9ew' str from dual
  3            )
  4  select  str,
  5          trim('+' from regexp_replace(str,'\D+','+')) expr,
  6          extractvalue(xmltype(dbms_xmlgen.getxml('select ' || trim('+' from regexp_replace(str,'\D+','+')) || ' val from dual')),'ROWSET/ROW/VAL') val
  7    from  t
  8  /

STR               EXPR                 VAL
----------------- -------------------- ----------
vb3df1vcbc234w9ew 3+1+234+9            247

SQL> 


SY.


первым делом подумал про этот вариант.
ибо сначала я подумал, что в строке 'asda123sss13aa2' надо вычислить 123+13+2
а оказалось нет.
22 окт 12, 22:54    [13359385]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
Всем огромное спасибо за помощь.
Обычно на форумах футболят искать по темам но вот тут реальный профит.

Очень благодарен всем!
22 окт 12, 23:11    [13359440]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10042
init.ora
первым делом подумал про этот вариант.
ибо сначала я подумал, что в строке 'asda123sss13aa2' надо вычислить 123+13+2
а оказалось нет.


Ooops. Но проблемы нет:

with t as (
           select 'vb3df1vcbc234w9ew' str from dual
          )
select  str,
        rtrim(regexp_replace(str,'\D*(\d)\D*','\1+'),'+') expr,
        dbms_aw.eval_number(rtrim(regexp_replace(str,'\D*(\d)\D*','\1+'),'+')) val
  from  t
/

STR               EXPR                   VAL
----------------- -------------------- -----
vb3df1vcbc234w9ew 3+1+2+3+4+9             22

SQL> 


with t as (
           select 'vb3df1vcbc234w9ew' str from dual
          )
select  str,
        rtrim(regexp_replace(str,'\D*(\d)\D*','\1+'),'+') expr,
        extractvalue(xmltype(dbms_xmlgen.getxml('select ' || rtrim(regexp_replace(str,'\D*(\d)\D*','\1+'),'+') || ' val from dual')),'ROWSET/ROW/VAL') val
  from  t
/

STR               EXPR                 VAL
----------------- -------------------- ----------
vb3df1vcbc234w9ew 3+1+2+3+4+9          22

SQL> 


with t as (
           select 'vb3df1vcbc234w9ew' str from dual
          )
select  str,
        rtrim(regexp_replace(str,'\D*(\d)\D*','\1+'),'+') expr,
        xmlcast(xmlquery(rtrim(regexp_replace(str,'\D*(\d)\D*','\1+'),'+') returning content) as number) val
  from  t
/

STR               EXPR                   VAL
----------------- -------------------- -----
vb3df1vcbc234w9ew 3+1+2+3+4+9             22

SQL> 


SY.

Сообщение было отредактировано: 22 окт 12, 23:46
22 окт 12, 23:38    [13359522]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
xtender
Member

Откуда: Мск
Сообщений: 5704
Еще пара вариантов здесь не прозвучавших:
with t as(select '$$1)))45.,,.54' s from dual)
select
   xmlquery((regexp_replace( s,'\D','+')||'+0')
            returning content) r
from t;

with t as(select '$$1)))45.,,.54' s from dual)
select
   sm
from t
model 
  partition by(rownum id)
  dimension by(0 n)
  measures(0 sm,s)
  rules iterate(4e4) until(iteration_number+1>=regexp_count(s[0],'\d+'))(
    sm[0]=sm[cv()]+regexp_substr(s[cv()],'(\d+)',1,iteration_number+1)
  );
22 окт 12, 23:45    [13359533]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
init.ora
ILIs544


попробую Ваш вариант, спасибо. Но он достаточно сложный... там еще фишка в том что это надо реализовать через простые функции... что просто раздражает


куда уж проще


select
length(a)-length(replace(a,'1',''))*1+
length(a)-length(replace(a,'2',''))*2+
length(a)-length(replace(a,'3',''))*3+
length(a)-length(replace(a,'4',''))*4+
length(a)-length(replace(a,'5',''))*5+
length(a)-length(replace(a,'6',''))*6+
length(a)-length(replace(a,'7',''))*7+
length(a)-length(replace(a,'8',''))*8+
length(a)-length(replace(a,'9',''))*9 as d
from(
	select 'asdasdasd1234278dfusdfh'  as a from dual
)z


этот вариант не работает. ну у меня. он считает не верно.
хотя понравился мне больше всего
23 окт 12, 09:59    [13360391]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
а если подумать ?

стоит правильно расставить скобки:

[color=red]([/color]  length(a)-length(replace(a,'9',''))  [color=red])[/color]  *9
23 окт 12, 10:09    [13360430]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
init.ora
Member

Откуда: гетто
Сообщений: 317
короче говоря скобки расставь правильно
23 окт 12, 10:10    [13360447]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
ILIs544
Member

Откуда:
Сообщений: 25
init.ora,

все разобрался..
спасибо просто огромнейшее!"!!
23 окт 12, 10:14    [13360471]     Ответить | Цитировать Сообщить модератору
 Re: Помогите пожалуйста с запросом  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10042
ILIs544
все разобрался..


Да, простое и касивое решение ot init.ora. Небольшая доводка:

select
(length(a)-length(replace(a,'1','')))*1+
(length(a)-length(replace(a,'2','')))*2+
(length(a)-length(replace(a,'3','')))*3+
(length(a)-length(replace(a,'4','')))*4+
(length(a)-length(replace(a,'5','')))*5+
(length(a)-length(replace(a,'6','')))*6+
(length(a)-length(replace(a,'7','')))*7+
(length(a)-length(replace(a,'8','')))*8+
(length(a)-length(replace(a,'9','')))*9 as d
from(
 select '555'  as a from dual
)z
/

         D
----------


SQL> 


select
(length(a)-nvl(length(replace(a,'1','')),0))*1+
(length(a)-nvl(length(replace(a,'2','')),0))*2+
(length(a)-nvl(length(replace(a,'3','')),0))*3+
(length(a)-nvl(length(replace(a,'4','')),0))*4+
(length(a)-nvl(length(replace(a,'5','')),0))*5+
(length(a)-nvl(length(replace(a,'6','')),0))*6+
(length(a)-nvl(length(replace(a,'7','')),0))*7+
(length(a)-nvl(length(replace(a,'8','')),0))*8+
(length(a)-nvl(length(replace(a,'9','')),0))*9 as d
from(
 select '555'  as a from dual
)z
/

         D
----------
        15

SQL> 


SY.
23 окт 12, 13:30    [13362202]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить