Oracle SQL文本字段计算

时间:2019-03-13 16:51:31

标签: sql oracle

使用Oracle SQL,我有一个表,其中包含一个表示方程式的文本字段(例如5*5)。我想创建一个显示该方程式值的视图(在本示例中为25)。

我看到其他文章建议创建自定义函数,但是我想避免这种情况。

请注意,这些方程比简单的乘法要复杂得多。如:

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

谢谢。

2 个答案:

答案 0 :(得分:0)

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表达式。创建视图时,将完成语法检查,从视图中进行选择时将完成评估。

请注意,如果表达式是任意输入,则应注意安全方面

答案 1 :(得分:0)

假设您有一个这样的表:

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