2013-03-12 57 views
1

我有3個字段的表評估有這樣的值:1,2,50,40使用列與另一列的Oracle

字段2(VARCHAR):有值,如: 「+」, 「 - 」, 「*」

字段3(NUMBER):像字段1:5,65.4,90

如何與該字段的內容評價2.

示例

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

這對您[Oracle文檔](http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/) dynamic.htm#i13130)結合[This ref cursor article](http://www.oracle.com/technetwork/articles/dotnet/williams-refcursors-092375.html) – xQbert 2013-03-12 21:06:49

回答

2

正如Annjawn在this answer中解釋的那樣,您可以使用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 Fiddle

我會強烈反對在數據庫中存儲計算列雖然建議。它只會導致問題,因爲如果您更新列沒有更新的數據庫。做到這一點的正確方法是要麼有一個視圖,包括計算的定義,並始終從該視圖中選擇或使用create table documentation中定義的VIRTUAL column

然後,您可以使用XMLQueryDETERMINISTIC function(例如the one provided by 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 Fiddle

這樣做的另一個好處是,你的計算是總是以完全相同的方式完成。對於需要此計算列的每個單獨代碼段,它們的實現方式不同

2

我不知道在PL/SQL外EXECUTE IMMEDIATE任何EVAL類型的功能,而這僅限於一個語句在同一時間。你不能建立一個會增加一行,增加另一個,減去另一個,但你可以創建一個遊標,通過它循環,並建立一個EXECUTE IMMEDIATE來評估每個遊標行上的值。當然,如果你考慮的操作比使用兩個操作數的簡單數學更復雜,那麼肯定會研究一下。

下面的查詢會做你問什麼,但如果你希望做任何事情,兩列之間的操作更加複雜,將很麻煩很快:

SELECT 
    CASE field2 
    WHEN '+' THEN field1 + field3 
    WHEN '*' THEN field1 * field3 
    WHEN '-' THEN field1 - field3 
    END 
FROM ... 
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中進行數學問題的鏈接。 Find out more