我有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
我有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
正如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
我會強烈反對在數據庫中存儲計算列雖然建議。它只會導致問題,因爲如果您更新列沒有更新的數據庫。做到這一點的正確方法是要麼有一個視圖,包括計算的定義,並始終從該視圖中選擇或使用create table documentation中定義的VIRTUAL column。
然後,您可以使用XMLQuery
或DETERMINISTIC 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
這樣做的另一個好處是,你的計算是總是以完全相同的方式完成。對於需要此計算列的每個單獨代碼段,它們的實現方式不同
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
我不知道在PL/SQL外EXECUTE IMMEDIATE
任何EVAL類型的功能,而這僅限於一個語句在同一時間。你不能建立一個會增加一行,增加另一個,減去另一個,但你可以創建一個遊標,通過它循環,並建立一個EXECUTE IMMEDIATE
來評估每個遊標行上的值。當然,如果你考慮的操作比使用兩個操作數的簡單數學更復雜,那麼肯定會研究一下。
下面的查詢會做你問什麼,但如果你希望做任何事情,兩列之間的操作更加複雜,將很麻煩很快:
SELECT
CASE field2
WHEN '+' THEN field1 + field3
WHEN '*' THEN field1 * field3
WHEN '-' THEN field1 - field3
END
FROM ...
你可以建立一個評價函數
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。
這對您[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