Вычисления в текстовом поле Oracle SQL - PullRequest
0 голосов
/ 13 марта 2019

Использование Oracle SQL У меня есть таблица, содержащая текстовое поле, представляющее уравнение (например, 5*5).Я хотел бы создать представление, которое отображает значение этого уравнения (в этом примере 25).

Я видел, как другие посты рекомендовали создавать собственные функции, однако я бы хотел этого избежать.

Обратите внимание, что уравнения могут быть намного сложнее, чем простое умножение.Например:

Exp(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001

Спасибо.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Скажем, у вас есть такая таблица:

create table expressions(e) as (
    select 'Exp(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001' from dual
   )

Это может быть способ:

create view expressions_evaluated as
select e,
       to_number(extractvalue(xmltype(dbms_xmlgen.getxml
        ('select ' || e || ' as result from dual')
       ),'/ROWSET/ROW/RESULT')) as result
from expressions

результат:

select * from expressions_evaluated

E                                                   RESULT
----------------------------------------------- ----------
Exp(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001 .000226724
0 голосов
/ 13 марта 2019

Oracle SQL не предоставляет функцию eval для оценки выражения "из коробки".

Таким образом, вы можете реализовать его в PL / SQL (поиск Oracle PL/SQL Eval function) или Проще говоря, вы можете создать динамическое представление на основе содержимого таблицы.

Пример - ваши данные

select * from tab;
EXPR                                        
--------------------------------------------
(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001
5*5

Запрос на создание динамического представления

select 'create view my_expr as ' as tab from dual union all
select q'{select q'[}'|| expr ||q'{]' as expr, }'|| expr ||' as result from dual union all' from tab union all
select 'select null, null from dual where 1=0' from dual;

Обратите внимание, что последняя строка является фиктивной, чтобы избавиться от последнего союза всех

Запрос возвращает

create view my_expr as 
select q'[(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001]' as expr, (-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001 as result from dual union all
select q'[5*5]' as expr, 5*5 as result from dual union all
select null, null from dual where 1=0

Какой скрипт для определения представления.

После создания представления вы получите результат:

select * from my_expr;

EXPR                                             RESULT
-------------------------------------------- ----------
(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001 -0,014450298
5*5                                                  25 

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

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

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