正如 Annjawn 在此答案中解释的那样,您可以使用 的一些内置功能XMLQuery
,特别.getnumberval()
是伪造公式。这将比 CASE 语句慢得多,但它更干净。
假设表:
create table tmp_test (
field1 number not null
, field2 varchar2(1) not null
, field3 number not null );
insert all
into tmp_test values (1, '+', 5)
into tmp_test values (1, '*', 5)
into tmp_test values (1, '-', 5)
select * from dual;
您的查询将如下所示:
SQL> select xmlquery(field1 || field2 || field3 returning content
2 ).getnumberval() as field4
3 from tmp_test;
FIELD4
----------
6
5
-4
SQL小提琴
我强烈建议不要在数据库中存储计算列。它只会导致问题,就好像您更新了您的列没有更新的数据库一样。执行此操作的正确方法是拥有一个包含计算定义的视图并始终从该视图中选择,或者使用创建表文档中定义的VIRTUAL 列。
然后,您可以使用XMLQuery
或DETERMINISTIC 函数(例如APC 提供的函数)来自动计算您的列。
如果您的表创建如下:
create table tmp_test (
field1 number not null
, field2 varchar2(1) not null
, field3 number not null
, field4 number generated always as (
xmlquery(field1 || field2 || field3 returning content
).getnumberval()
) virtual
);
然后一个更简单的查询将得到你的结果
SQL> select * from tmp_test;
FIELD1 F FIELD3 FIELD4
---------- - ---------- ----------
1 + 5 6
1 * 5 5
1 - 5 -4
SQL小提琴
这样做的另一个好处是您的计算始终以完全相同的方式完成。对于需要此计算列的每个单独的代码,它们的实现方式不同