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

Откуда: Самара
Сообщений: 711
Задача такая:

есть таблица :


N            Пётр
L Борисов
C 10
Z 20
Z+C ? (надо получить 30)
N||L ? (надо получить Петр Борисов)

Допускаются +,-,*,/,(,),||
Конкатенация допустима только к строкам, остальные операторы - только к числам.

Возможно ли?
11 июн 19, 19:09    [21907010]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1340
Возможно.

Реализуйте свой парсер птичьего языка.
11 июн 19, 19:15    [21907015]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
dmdmdm,

а оракловских пакетов на эту тему нет?
11 июн 19, 19:46    [21907027]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9597
with tbl as (
              select 'N' tag,'Peter' val from dual union all
              select 'L' tag,'Borisov' val from dual union all
              select 'C' tag,'10' val from dual union all
              select 'Z' tag,'20' val from dual
            ),
   input as (
               select 'Z+C' expr from dual union all
               select 'N||L' expr from dual
              )
select  expr,
        xmlcast(
                xmlquery(
                         '/ROWSET/ROW/C'
                         passing xmltype(
                                         dbms_xmlgen.getxml(
                                                            'select ' || regexp_replace(
                                                                                        expr,
                                                                                        '([A-Z]+)',
                                                                                        '(select val from tbl where tag = ''\1'')'
                                                                                       ) || ' c from dual'
                                                           )
                                        )
                         returning content
                        )
                as varchar2(30)
               ) res
  from  input
/

EXPR RES
---- ------------------------------
Z+C  30
N||L PeterBorisov

SQL>  


SY.
11 июн 19, 19:52    [21907030]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
SY
SY.


Есть замечательная водка "Русалка" самарского завода Родник. Как насчёт субботы? Могу завезти.
11 июн 19, 20:05    [21907034]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
Кобанчег
Member

Откуда: Рахів
Сообщений: 568
Victor Cookin
dmdmdm,

а оракловских пакетов на эту тему нет?
xmlquery может кое-что посчитать, если ему в правильном виде скормить.

with
t (x,value) as
(select 'N', 'Petr' from dual
union all select 'S', ' ' from dual
union all select 'L', 'Borisov' from dual
union all select 'C', '10' from dual
union all select 'Z', '20' from dual),
t0 (expr) as
(select 'Z+C' from dual
union all select '(Z+C)/C/Z' from dual
union all select 'N||S||L' from dual)
select xmlquery(min(result) keep (dense_rank last order by rn) returning content) result
from
(
  select *
  from
  (select replace(case when instr(expr,'||')>0
                       then 'fn:concat('||rtrim(regexp_replace(expr, '(\S)(\|\|)?', '''\1'','),',')||')'
                       else expr
                  end,'/',' div ') expr, x, value
     from t0 join t on instr(expr,x)>0)
  model
  partition by (expr)
  dimension by (rownum rn)
  measures (cast(expr as varchar2(4000)) result, x, value)
  (
    result[any] order by rn = presentv(result[cv(rn)-1],
                                       replace(result[cv(rn)-1],x[cv(rn)],value[cv(rn)]),
                                       replace(result[cv(rn)],x[cv(rn)],value[cv(rn)]))
  )
)
group by expr;

RESULT
--------------------------------------------------------------------------------
.15
30
Petr Borisov
11 июн 19, 20:13    [21907038]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9597
Victor Cookin
Есть замечательная водка "Русалка" самарского завода Родник. Как насчёт субботы? Могу завезти.


Ну если визу получить успеешь то заезжай .

SY.
11 июн 19, 20:14    [21907039]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
Victor Cookin
Member

Откуда: Самара
Сообщений: 711
Кобанчег,

Я так совсем сопьюсь
11 июн 19, 21:20    [21907056]     Ответить | Цитировать Сообщить модератору
 Re: evaluate simple expressions  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 29297
Ребяты изощрённо не жалеют гвоздей для крышки гроба...
12 июн 19, 07:29    [21907163]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить