Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / evaluate simple expressions / 9 сообщений из 9, страница 1 из 1
11.06.2019, 19:09
    #39825573
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Задача такая:

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


Код: plaintext
1.
2.
3.
4.
5.
N            Пётр
L             Борисов
C            10
Z            20
Z+C        ? (надо получить 30)
N||L        ? (надо получить Петр Борисов)

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

Возможно ли?
...
Рейтинг: 0 / 0
11.06.2019, 19:15
    #39825577
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Возможно.

Реализуйте свой парсер птичьего языка.
...
Рейтинг: 0 / 0
11.06.2019, 19:46
    #39825588
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
dmdmdm,

а оракловских пакетов на эту тему нет?
...
Рейтинг: 0 / 0
11.06.2019, 19:52
    #39825590
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
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.
...
Рейтинг: 0 / 0
11.06.2019, 20:05
    #39825594
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
SYSY.

Есть замечательная водка "Русалка" самарского завода Родник. Как насчёт субботы? Могу завезти.
...
Рейтинг: 0 / 0
11.06.2019, 20:13
    #39825597
Кобанчег
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Victor Cookindmdmdm,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
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
...
Рейтинг: 0 / 0
11.06.2019, 20:14
    #39825598
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Victor CookinЕсть замечательная водка "Русалка" самарского завода Родник. Как насчёт субботы? Могу завезти.

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

SY.
...
Рейтинг: 0 / 0
11.06.2019, 21:20
    #39825604
Victor Cookin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Кобанчег,

Я так совсем сопьюсь
...
Рейтинг: 0 / 0
12.06.2019, 07:29
    #39825649
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
evaluate simple expressions
Ребяты изощрённо не жалеют гвоздей для крышки гроба...
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / evaluate simple expressions / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]