アンジョーンがこの回答で説明しているように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 つの利点は、計算が常にまったく同じ方法で行われることです。この計算列を必要とするコードの個々の部分ごとに実装が異なるわけではありません。