1

我有一个包含 3 个字段的表:

字段 1 (NUMBER):具有如下值:1, 2,50 ,40

字段 2 (VARCHAR):具有如下值:“+”、“-”、“*”

字段 3(数字):如字段 1:5,65.4, 90

我如何评价这个领域的内容 2.

例子

|field1| field2| field3| RESULT
-------------------------------
|     1|      +|      5|  6
|     1|      *|      5|  5
|     1|      -|      5| -4
4

4 回答 4

2

我不知道EXECUTE IMMEDIATEPL/SQL 之外的任何 EVAL 类型功能,并且一次仅限于一个语句。您无法构建将添加一行、乘以另一行并减去另一行的东西,但您可以创建一个游标,循环遍历它,并构建一个EXECUTE IMMEDIATE以评估每个游标行上的值。如果您正在考虑比具有两个操作数的简单数学更复杂的操作,请务必考虑一下。

下面的查询将按照您的要求执行,但是如果您要执行比两列之间的操作更复杂的操作,它很快就会变得很麻烦:

SELECT
  CASE field2
    WHEN '+' THEN field1 + field3
    WHEN '*' THEN field1 * field3
    WHEN '-' THEN field1 - field3
  END
FROM ...
于 2013-03-12T21:11:40.403 回答
2

正如 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 列

然后,您可以使用XMLQueryDETERMINISTIC 函数(例如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小提琴

这样做的另一个好处是您的计算始终以完全相同的方式完成。对于需要此计算列的每个单独的代码,它们的实现方式不同

于 2013-03-13T07:26:04.257 回答
1

你可以建立一个评估函数

create or replace function eval 
   ( n1 in number
     , n2 in number
     , op in varchar2 )
return number deterministic
as
   result number;
begin
   execute immediate ' select :1 '|| op || ' : 2 from dual'
      into result
      using n1, n2;
    return result;
end;
/

然后您可以在 SELECT 语句中调用它:

select eval ( field1, field3, field2) as result 
from your_table;

这将处理简单的算术,但它不是更复杂的公式的好方法。如果你想走这条路,我建议你点击我对另一个关于在 PL/SQL 中做数学的问题的回答中的链接。 了解更多

于 2013-03-13T05:26:20.163 回答
0
SELECT
  field1,
  field2,
  field3,
  Case
   When field2='+' then field1+field3
   When field2='*' then field1*field3
   When field2='-' then field3-field1
   else 0
  end as Result
FROM table

http://www.techonthenet.com/oracle/functions/case.php

于 2013-03-12T21:11:31.540 回答