1

私は3つのフィールドを持つテーブルを持っています:

フィールド 1 (NUMBER): 次のような値を持ちます: 1、2,50、40

フィールド 2 (VARCHAR): 「+」、「-」、「*」などの値を持ちます

フィールド 3 (NUMBER): 同様に Field1: 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 型の機能については知りませんが、一度に 1 つのステートメントに制限されています。ある行を加算し、別の行を乗算し、さらに別の行を減算するものを作成することはできませんが、カーソルを作成し、それをループして、EXECUTE IMMEDIATE各カーソル行の値に対して評価する を作成することはできます。2 つのオペランドを持つ単純な数学よりも複雑な演算を考えている場合は、必ず調べてください。

以下のクエリは、あなたが求めたことを実行しますが、2 つの列間の操作よりも複雑なことをしようとしている場合は、すぐに面倒になります。

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

アンジョーンがこの回答で説明しているように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 フィドル

ただし、計算列をデータベースに保存しないことを強くお勧めします。データベースを更新した場合、列が更新されない場合にのみ問題が発生します。これを行う正しい方法は、計算の定義を含むビューを持ち、常にこのビューから選択するか、 create table ドキュメントで定義されているように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 フィドル

これのもう 1 つの利点は、計算が常にまったく同じ方法で行われることです。この計算列を必要とするコードの個々の部分ごとに実装が異なるわけではありません。

于 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 に答える