使用Oracle SQL
,我有一个表,其中包含一个表示方程式的文本字段(例如5*5
)。我想创建一个显示该方程式值的视图(在本示例中为25
)。
我看到其他文章建议创建自定义函数,但是我想避免这种情况。
请注意,这些方程比简单的乘法要复杂得多。如:
Exp(-2.02 + 2.46 * LN(0.66)) * 0.95 * 5 * 0.001
谢谢。
答案 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