ヘッダーをスキップ
Oracle OLAP DMLリファレンス
11g リリース1(11.1)
E05732-02
  目次へ
目次
索引へ
索引

戻る
戻る
 
次へ
次へ
 

OLAP DML式

式は、OLAP DMLの構文に従ってデータ値を表したものです。この項では、OLAP DML式に関して次の内容を説明します。

OLAP DML式の概要

OLAP DML式はデータ型を持ち、ディメンションを持つ場合もあります。式は、文の中で引数として使用できます。多くの場合、式は数値演算や論理演算を実行します。式は、常にワークスペースのいずれかのデータ型の結果に評価されます。

式には、次のものが含まれます。

  • リテラル値(例: 10'East'

  • 複数の値を含むアナリティック・ワークスペース・オブジェクト(例: 変数sales

  • 1つ以上の値を返すファンクション(例: TOTALやJOINLINES)

  • リテラル値、ディメンション、変数、計算式およびファンクションを、演算子と組み合せた式(例: inflation*1.02

式は計算式として保存できます(「OLAP DML計算式」を参照)。

式のデータ型を判定する方法

結果値のデータ型が、式のデータ型になります。これは、式を構成するデータ・オブジェクトのデータ型と同じになるとは限りません。データ、および関連する演算子とファンクションによって異なります。

また、IF... THEN... ELSE演算子で示される条件式もサポートされます。条件式が返す値のデータ型は、IF句の式(必ずBOOLEANになる)ではなく、THENおよびELSE句の式によって決まります。


注意:

条件式を、プログラムのIF...THEN...ELSEコマンドと混同しないでください。構文は似ていますが、目的が異なります。IF文はデータ型を持たず、式のように評価されることはありません。

式のディメンション性を判定する方法

式のディメンション化は次のように、その式のすべての変数、ディメンション、リレーション、計算式、修飾データ参照およびファンクションのディメンションが1つに結合されることにより行われます。

  • 変数、リレーションおよび計算式は、オブジェクトの定義にリストされたディメンションによってディメンション化されます。

    例1: price変数がmonthおよびproductによってディメンション化されている場合、式price * 1.2monthおよびproductによってディメンション化されます。

    例2: units変数がmonthproductおよびdistrictによってディメンション化されている場合、式units * pricemonthproductおよびdistrictによってディメンション化されます(price変数のディメンションがmonthおよびproductのみの場合でも)。

  • 修飾データ参照(QDR)は、修飾されているディメンションを除く、関連付けられているオブジェクトのすべてのディメンションによってディメンション化されます。修飾データ参照の詳細は、「ステータスを変更せずにディメンションを単一の値に制限する方法」を参照してください。

  • 通常、ほとんどのOLAP DMLファンクションの戻り値は、入力引数のディメンションの結合によってディメンション化されます。ただし、一部のファンクション(集計ファンクションなど)のディメンションは入力引数より小さくなります。この場合の戻り値のディメンション性については、第7章「OLAP DMLファンクション: A〜K」のファンクションの項目を参照してください。


    注意:

    特に記載されていないかぎり、集計ファンクションで分割ディメンションまたは分割リレーションを指定すると、式のディメンション性が変更されます。分割ディメンションとして指定した最初のディメンションは最も遅く変化し、最後に指定したディメンションは最も速く変化します。


注意:

CHGDIMSファンクションを使用して、式または副式のディメンション性を変更できます。

式のディメンションの判定

PARSE文およびINFOファンクションを発行すると、式のディメンションを調べることができます。PARSEは式のテキストを評価し、INFOは式の解析方法を示します。

この例では、INFOファンクションでDIMENSIONキーワードを使用し、PARSEによって分析された式のディメンションを取得する方法を示します。次の文を発行したとします。

PARSE 'TOTAL(sales region)'

この文によって生成される出力は、次のとおりです。

SHOW INFO(PARSE DIMENSION)
REGION

ディメンション・ステータスによる式の結果(値の数)への影響

式によって生成される値の数は、式のディメンションおよびそのディメンション・ステータスによって異なります。1つの式によって、現行のステータス内にあるディメンション値の各組合せに対して、1つのデータ値が導出されます。たとえば、ステータスにあるディメンション値がmonthに3つ、productに2つ存在する場合、式price GT 100の結果は6つの値(3 X 2)になります。

そのため、目的の結果を得るには、式のディメンションを検討するデータの範囲に制限する必要があります。また、PERMIT文を使用してデータのディメンションへのアクセスを制限することを考慮する必要があります。

現行のステータスを変更せずに単一の値を指定する場合、修飾データ参照(QDR)を使用できます。QDRを使用すると、ディメンション(式に1つのディメンション値を指定可能)や、変数またはリレーションの1つ以上のディメンションを修飾できます。ディメンション・ステータスの詳細は、「OLAP DML処理対象のデータ・セットの指定方法」を参照してください。QDRの詳細は、「ステータスを変更せずにディメンションを単一の値に制限する方法」を参照してください。

式でのワークスペース・オブジェクトの使用方法

式でアナリティック・ワークスペースのデータ・オブジェクトを使用するには、その名前を指定します(「式にオブジェクトを指定する構文」を参照)。式を計算する際、Oracle OLAPは指定されたオブジェクトのデータを使用します(「式におけるOLAP DMLデータ・オブジェクトの動作」を参照)。

式におけるOLAP DMLデータ・オブジェクトの動作

表2-12では、式の中で引数として使用されるオブジェクトのデータを、Oracle OLAPがどのように使用するのかを示します。

表2-12 式のオブジェクト

オブジェクト 式での使用

変数

定義に応じて、1次元配列または多次元配列のデータとして使用。たとえば、代入文のターゲット式またはソース式として使用される。

参照: 「式における変数とリレーションの使用方法」および「代入文でのオブジェクトの使用」

リレーション

定義に応じて、1次元または多次元のデータとして使用。たとえば、代入文のターゲット式またはソース式として使用される(「代入文でのオブジェクトの使用」を参照)。

  • テキスト式でリレーションを使用する場合、リレーション値はテキスト値として参照される。リレーションに含まれる関連ディメンションの値がテキストに変換され、これらの値を式で使用できる。テキスト・リテラルをリレーションと比較することも可能。

  • 数式でリレーションを使用する場合、リレーション値はその関連ディメンションの配列における位置(INTEGER)により参照される。この数値は式で使用可能。位置番号は、ディメンションの現行のステータス・リストではなく、ディメンションのデフォルトのステータス・リストに基づく。

参照: 「式における変数とリレーションの使用方法」および「式における関連ディメンションの使用方法」

ディメンション

1次元配列のデータとして使用。数式でTEXTディメンション値を使用する際や、非数値のディメンション値を比較する際、Oracle OLAPは値そのものではなく、配列にある値のINTEGER位置番号(デフォルトのステータス・リストに基づく)を使用する。

参照: 「CONCATディメンションの値の指定」および「式における関連ディメンションの使用方法」

コンポジット

ディメンションが使用可能な場所ではコンポジットを使用できる。

参照: 「コンポジットの値の指定」

値セット

ディメンション値のリストとして使用。

参照: 「式における変数とリレーションの使用方法」およびDEFINE VALUESETコマンド

ディメンション・サロゲート

1次元配列として使用。サロゲートは、ディメンションの値の代替セットを提供する。数式でTEXTサロゲート値を使用する際や、非数値のサロゲートの値を比較する際、Oracle OLAPは値そのものではなく、配列にある値のINTEGER位置番号(デフォルトのステータス・リストに基づく)を使用する。

注意: モデル、LIMITコマンド、修飾データ参照、または文(FILEREAD、FILEVIEW、SQL FETCH、SQL IMPORTなど)でロードするデータでは、ディメンションのかわりにサロゲートを使用できる。他のオブジェクトを定義するDEFINE文の場合、引数のオブジェクトにサロゲートは指定できない。

計算式

文の副式または式として使用。

プログラム

値を返さないプログラムでは、OLAP DMLコマンドと同じようにプログラム名を使用する。値を返すプログラムでは、OLAP DMLファンクションを実行するのと同じ方法でプログラムを実行する。すなわち、式の中でプログラム名を使用し、プログラム引数がある場合はカッコで囲む。


式にオブジェクトを指定する構文

次の構文を使用して、アナリティック・ワークスペース・オブジェクトを式の中に指定できます。

[[schema-name.]analytic-workspace-name!]object-name

schema-name

アナリティック・ワークスペースが作成、定義されたスキーマの名前。デフォルトでは、AW CREATE文を発行するユーザーのデータベース・ユーザーIDのスキーマ内にアナリティック・ワークスペースが作成されます。ほとんどのDML文では、アナリティック・ワークスペースのフルネーム(Scott.demoなど)を指定できます。

analytic-workspace-name

目的のオブジェクトを含むワークスペースの名前。オブジェクト名とアナリティック・ワークスペース名を指定することで、オブジェクトの修飾オブジェクト名(QON)が作成されます。「修飾オブジェクト名を使用しない場合」で説明されている状況以外では、オブジェクトの修飾オブジェクト名を使用することをお薦めします。

analytic-workspace-nameの値は、次のいずれかで指定できます。

  • アナリティック・ワークスペースの名前。ワークスペース名は、アナリティック・ワークスペースをAW CREATE文で作成するときに割り当てられます。

  • アナリティック・ワークスペースの別名。アナリティック・ワークスペースの別名とは、アタッチされたアナリティック・ワークスペースの代替名です。AW ALIAS LIST文を使用すると、別名の割当てまたは削除を行うことができます。別名は、その別名が割り当てられてから、ワークスペースがデタッチされるまで(または別名が削除されるまで)有効です。そのため、アタッチされていないワークスペースをアタッチするたびに、別名を再度割り当てる必要があります。

    別名を割り当てる理由の1つは、他のユーザーのスキーマに含まれるアナリティック・ワークスペースを簡単に参照できるようにするためです。たとえば、そのようなアナリティック・ワークスペースを参照する修飾オブジェクト名および文に別名を使用できます。別名を割り当てるもう1つの理由は、アナリティック・ワークスペースへの参照を含むがその名前をハードコードしない汎用コードを記述するためです。一般参照を提供する別名を使用すると、別名を割り当て、異なる時点で異なるワークスペースに対してコードを実行できます。

  • 集計仕様、モデルまたはプログラム内でTHIS_AWにより修飾されたオブジェクト名。Oracle OLAPがオブジェクトをコンパイルする際、THIS_AWはすべてオブジェクトがコンパイルされるワークスペースの名前として解釈されます。したがって、myprogという名前のプログラムとmyvarという名前の変数を含むmyworkspaceという名前のアナリティック・ワークスペースがある場合、Oracle OLAPは文myvar=1をmyworkspace!myvar=1として解釈します。プログラム内では、THIS_AWオプションを使用してTHIS_AWの値を取得できます。

analytic-workspace-nameの値を指定しない場合、Oracle OLAPは指定されたオブジェクトが現行のアナリティック・ワークスペースにあると判断します。現行のアナリティック・ワークスペースとは、AW LIST文を使用して表示する、アクティブ・アナリティック・ワークスペースのリストの先頭のアナリティック・ワークスペースのことです。現行のアナリティック・ワークスペースの名前は、AWファンクションにNAMEキーワードを指定することによって取得できます。


注意:

セッションには、現行のアナリティック・ワークスペースは必要ありません。アナリティック・ワークスペース名を指定せずにOracle OLAPを起動すると、EXPRESSアナリティック・ワークスペースがリストの先頭になります。ただし、この場合、EXPRESSアナリティック・ワークスペースは現行のアナリティック・ワークスペースではありません。AWコマンドで指定しないかぎり、現行のアナリティック・ワークスペースは存在しません。

object-name

名前のないコンポジット以外のオブジェクトの名前。オブジェクトが名前のないコンポジットである場合は、次の構文を使用します。

SPARSE <basedims....>

basedims引数には、名前のないコンポジットを作成する対象となるディメンションの名前を空白で区切って指定します。OLAP DML文における名前のないコンポジットの使用例は、例10-104「コンポジットによってディメンション化されたデータのレポート」を参照してください。

異なるワークスペースにある同じ名前のオブジェクトは、完全に別のオブジェクトとして扱われ、それらの間に類似点や関連性が存在するとは判断されません。異なるワークスペースのオブジェクト間に適用されるOLAP DML言語制限は、オブジェクトの名前が同じ場合にも適用されます。たとえば、両方のワークスペースに同じ名前のディメンションが存在する場合でも、一方のワークスペースのオブジェクトを、もう一方のワークスペースに存在するディメンションによってディメンション化することはできません。

修飾オブジェクト名を作成および使用する際の注意点

オブジェクトに対して修飾オブジェクト名を使用するのは一般的ですが、次のような点に注意してください。

修飾オブジェクト名を使用しない場合

通常、式では修飾オブジェクト名を使用します。しかし、場合によっては、修飾オブジェクト名を使用できない、または修飾オブジェクト名を使用する必要のないことがあります。

  • 次のオブジェクトには、修飾オブジェクト名を使用できません。

    • ARGUMENT文またはVARIABLE文により作成された、特定のプログラムに固有のオブジェクト。

    • 任意のワークスペースのNAMEディメンション。NAMEディメンションを参照する際、Oracle OLAPは常に現行のワークスペースのNAMEディメンションを使用します。

  • 次の状況では、修飾オブジェクト名を使用する必要がありません。

    • 修飾データ参照(QDR)の修飾子内。修飾オブジェクト名が必要なのは、修飾されるオブジェクトのみです。修飾されていない名前は、修飾されるオブジェクトと同じワークスペースのオブジェクトに適用されるものと判断されます。

    • 名前のないコンポジット内。あるベース・ディメンションを修飾オブジェクト名として指定すると、他のすべてのベース・ディメンションが同じワークスペースのものと判断されます。

    • 名前付きコンポジット内。名前が修飾オブジェクト名の場合、そのベース・ディメンションが同じワークスペースのものと判断されます。

    • モデル内。ソリューション変数を修飾オブジェクト名として指定すると、DIMENSION文で名前が付けられたすべてのディメンションが同じワークスペースのものと判断されます。

ワークスペースおよびオブジェクト名のアンパサンド置換の使用方法

アンパサンド置換を使用して、ワークスペース名、オブジェクト名、またはその両方を指定できます。ただし、Oracle OLAPは修飾オブジェクト名(感嘆符を含む)を解析した後にアンパサンド参照を解決するため、アンパサンド置換で修飾オブジェクト名を使用する際には注意が必要です。たとえば、&awname!objnameという式では、アンパサンド(&)はワークスペース名のみではなく修飾オブジェクト名全体に適用されます。

プログラムに修飾オブジェクト名を渡す場合

修飾オブジェクト名を引数としてプログラムに渡し、ARGUMENT文およびARG、ARGFR、ARGSの各ファンクションを使用する場合は、修飾オブジェクト名全体が単独の引数とみなされます。そのコンポーネント部分は別々には渡されません。

式におけるディメンションとコンポジットの値の指定

ほとんどの場合、データ型ごとに決められた表記方法に基づいて値を指定するのみで、ディメンションの値を参照できます。例として、geogという名前を持つTEXTディメンションを考えます。このディメンションに「World」という値を追加するには、次の文を発行します。

MAINTAIN geog ADD 'World'

ただし、数式でTEXTディメンション値を使用する場合や、非数値のディメンション値を比較する場合、Oracle OLAPでは、値そのものではなく、配列にある値のINTEGER位置番号(デフォルトのステータス・リストに基づく)を使用します。

コンポジットの値および連結ディメンジョンの値の指定については、別の方法で行います。

コンポジットの値の指定

コンポジットの値を指定する方法は次のとおりです。

  • 次の構文に基づいて、コンポジットのベース・ディメンションの値セットを指定します。

          {composite_name | SPARSE} {<base_dimension_name base_dimension_value }, ...>

  • (名前付きコンポジットの場合のみ)次の構文に基づいて、コンポジットの値のみを指定します。

           composite_name <base_dimension_value ...>

    ただし、base_dimension_valueには、ベース・ディメンションの値セットを、コンポジット内で定義されている順に空白で区切って指定します。

CONCATディメンションの値の指定

一意のCONCATディメンションを定義した後は、単にベース・ディメンション値を指定するのみでその値を参照できます。

ただし、非一意のCONCATディメンションの値は、ベース・ディメンションの名前とベース・ディメンション値をコロン(:)および空白で区切って連結した上で、山カッコ(<>)で囲んで指定する必要があります。式では、次のフォーマットを使用します。

     <BASE_DIMENSION_NAME: base_dimension value>

たとえば、cityおよびstateというベース・ディメンションと、それらのディメンションを持つgeogという連結ディメンションを定義したとします。geogディメンションについてレポートすると、geogの値にベース・ディメンションの名前とその値が含まれます。

DEFINE city DIMENSION TEXT
DEFINE state DIMENSION TEXT
DEFINE geog DIMENSION CONCAT(city state)
MAINTAIN city ADD 'New York'
MAINTAIN state ADD 'New York'
REPORT geog

 GEOG
-----------------------------------
<CITY: New York>
<STATE: New York>

式における関連ディメンションの使用方法

一部のOLAP DML文(たとえばLIMITコマンドを基にした一部の文)では、ディメンションおよび関連ディメンションとして参照される2つディメンション引数を持つ構文が使用されます。関連ディメンションついて結果のディメンション性を指定できるOLAP DML文(AVERAGE、ANY、COUNT、CUMSUM、NONE、LARGEST、SMALLEST、TOTALなど)もあります。この場合の関連ディメンションとは、あるディメンションとリレーションを共有する任意のディメンションを指します。

こうした文の引数に指定する値がディメンション名であっても、実際の計算にはディメンション間のリレーションが使用されます。2つのディメンションが共有するリレーションが1つのみである場合、処理は単純です。Oracle OLAPでは、そのリレーション内の値に基づいて計算が実行されます。

ただし、2つのディメンションが共有するリレーションが複数ある場合、処理はやや複雑になります。LIMITコマンド(LEVELRELを使用)と同様に、Oracle OLAPで使用する共有リレーションを指定できる場合もありますが、構文の制約により、リレーションの名前が指定できない場合もあります。この場合、複数のリレーションの中からOracle OLAPによる選択が行われます(「Oracle OLAPでの複数リレーション間の選択方法」を参照)。

式における変数とリレーションの使用方法

式における変数は、指定されたデータ型の値を含む配列として参照されます。またリレーションは、指定されたディメンションの値を含む配列として参照されます。その他の点においては、変数およびリレーション(どちらも通常は多次元オブジェクト)は基本的に同じものです。

ほとんどの場合、コンポジットで定義される変数をOLAP DML文に含めると、文はそれらの変数をベース・ディメンションで定義されたものと同様に処理します。

  • ベース・ディメンション値のいずれかを要求することで、コンポジットによってディメンション化された変数にアクセスできます。

  • ステータスにあるコンポジットの値は、コンポジットのベース・ディメンションのステータスによって決定されます。コンポジットはディメンションではないため、コンポジットには固有のステータスはありません。

REPORT文、またはコンポジットを使用する変数をループ処理する他の文を使用すると、デフォルトの動作として、ステータスにあるコンポジットのベース・ディメンション値の組合せがすべて評価されます。コンポジットに存在しない組合せの場合、関連付けられているデータはNAと表示されます。

たとえば、次の文を実行すると、2002年1月から3月にスポーツウェア向けに発行されたクーポン券の数を示す、East地域に関するレポートが作成されます。2002年3月にはクーポン券が発行されなかったため、レポートの該当の列にはNAと表示されます。

LIMIT month TO 'Jan02' 'Feb02' 'Mar02'
LIMIT market TO 'East'
LIMIT product TO 'Sportswear'
REPORT coupons

MARKET: EAST
               ------------COUPONS-------------
               -------------MONTH--------------
PRODUCT          Jan02      Feb02      Mar02
-------------- ---------- ---------- ----------
Sportswear          1,000      1,000         NA

ただし、パフォーマンス上の理由から、REPORT、ROWなどの文および代入文(SET)のデフォルトのループ動作を変更し、すべてのベース・ディメンション値ではなく、コンポジットの値をループ処理するように変更できます。

ステータスを変更せずにディメンションを単一の値に制限する方法

修飾データ参照(QDR)を使用すると、データ・オブジェクトの1つ以上のディメンションを単一の値に制限できます。QDRは、現行のステータスを変更せずにデータ・オブジェクトの単一の値を指定する場合に有効です。QDRを使用すると、ディメンション(式に1つのディメンション値を指定可能)や、変数またはリレーションの1つ以上のディメンションを修飾できます。

使用しているQDRの構文があいまいであるため、誤って解釈されるか、構文エラーが発生することがあります。この場合、QUALファンクションを使用して修飾データ参照(QDR)を明示的に指定できます。

修飾データ参照の構文

修飾データ参照は、次の構文を使用して指定します。

     expression(dimname1 dimexp1 [, dimname2 dimexp2. . .])

dimname引数は、式に含まれる1つのディメンションの名前、またはディメンションのディメンション・サロゲートです。dimexp引数は、次のいずれかです。

  • dimnameの値


    注意:

    LIMITSTRICTオプションの設定により、存在しない値がQDRで指定された場合のOracle OLAPの動作が決まります。存在しない値を指定した場合、デフォルトでは、存在しない値は無効な値として処理され、エラーが発生します。存在しない値がNA値として処理されるようにするには、LIMITSTRICTの値をNOに設定します。

  • 結果がdimnameの値となるテキスト式

  • 結果がdimnameの値に対する論理位置となる数式

  • dimnameのリレーション


    注意:

    使用しているQDRの構文があいまいであるため、誤って解釈されるか、構文エラーが発生する可能性がある場合は、QUALファンクションを使用して修飾データ参照(QDR)を明示的に指定します。

変数の修飾

次のいずれかの方法で、変数の任意またはすべてのディメンションを修飾できます。

  • ディメンションの指定された値を1つ選択すると、QDRにより変数のディメンションが一時的に制限されます。この値は、現行のステータスの範囲外になる可能性があります。

  • 修飾子として適切なリレーションの名前を指定すると、QDRにより変数のディメンションが、より下位の集計関連ディメンションと置き換えられます。ディメンションは、リレーションのディメンションに一時的に置き換えられます。

たとえば、変数salesには、monthproductおよびdistrictの3つのディメンションがあります。Bostonの売上総額を、全都市の売上総額と比較するとします。単一の文において、次のようにdistrictを2つの異なる値に制限します。

  • 式の分子は、districtのステータスをBostonにします。

  • 式の分母は、districtのステータスをALLにします。

次の文により、QDRを使用してこの結果を計算できます。

SHOW sales(district 'Boston')/TOTAL(sales)

変数の複数のディメンションを修飾できます。たとえば、各ディメンションの1つのディメンション値を指定してsales変数のすべてのディメンションを修飾する場合、salesを単一のセル値の範囲に制限します。

Jun02TentsおよびSeattleの売上高をフェッチするには、次のQDRを使用します。

SHOW sales(month 'Jun02', product 'Tents', district 'Seattle')

この文は、単一の値をフェッチします。

代入(SET)文のターゲット式で修飾データ参照を使用できます。これにより、データ・オブジェクト内の特定のセルに値を代入できます。

次の例では、修飾データ参照で指定されたsalesコンポジットのデータ・セルに、値10200を代入します。salesという名前のコンポジットに、BostonおよびTentsの組合せの値がまだ存在しない場合、この値の組合せがコンポジットに追加され、データ・セルが追加されます。

sales(market 'Boston' product 'Tents' month 'Jan99')= 10200

変数のディメンションの置換

QDRの修飾子としてリレーションを使用する場合、変数のディメンションをリレーションのディメンション(複数可)に置き換えることができます。リレーションは、修飾するディメンションに関連している必要があり、置換ディメンションによってディメンション化される必要があります。

例2-1 変数のディメンションの置換

monthproductおよびdistrictによってディメンション化された2つの変数salesおよびquotaが存在するとします。3番目の変数division.mgrは、monthおよびdivisionによってディメンション化されています。divisionproductの間には、division.productというリレーションも存在します。これらのオブジェクトは、次のように定義されています。

DEFINE sales VARIABLE DECIMAL <month product district>
LD Sales Revenue
DEFINE quota VARIABLE DECIMAL <month product district>
DEFINE division.mgr VARIABLE TEXT <month division>
DEFINE division.product RELATION division <product>
LD Division for each product

次の文により、文の下にあるようなレポートが生成されます。

REPORT division.mgr

-------------------DIVISION.MGR----------------------
          ----------------------MONTH--------------------------
DIVISION  JAn02    Feb02    Mar02    Apr02    May02    Jun02
--------  -------- -------- -------- -------- -------- --------
Camping   Hawley   Hawley   Jones    Jones    Jones    Jones
Sporting  Carey    Carey    Carey    Carey    Carey    Musgrave
Clothing  Musgrave Musgrave Musgrave Musgrave Musgrave Wong

売上高のノルマの達成率を、各製品を担当する事業部長名とともに表示するレポートを取得するとします。各製品の事業部長名を表示するには、修飾子として、divisionに関連付けられてproductによってディメンション化されているリレーションdivision.productを使用します。QDRは、divisionディメンションをproductに置き換えるため、レポートsales / quotaの他の式と同じディメンションを持つことになります。次の文により、文の下にあるようなレポートが生成されます。

REPORT DOWN month sales W 6 sales/quota W 8 HEADING -
   'MANAGER' division.mgr(division division.product)

DISTRICT: BOSTON
        -----------------------------PRODUCT------------------------------------
        ----TEnts---- ---canoes---- --racquets---  --sportswear-- ---footwear---
        Sales/        Sales/        Sales/         Sales/         Sales/
Month   Quota Manager Quota Manager Quota Manager  Quota Manager  Quota  Manager
------  ----- ------- ----- ------- ----- -------  ----- -------- ----- --------
Jan02   1.00  Hawley  0.82  Hawley  1.02  Carey    0.91  Musgrave 0.92  Musgrave
Feb02   0.84  Hawley  0.96  Hawley  1.00  Carey    0.80  Musgrave 1.07  Musgrave
Mar02   0.87  Jones   0.95  Jones   0.87  Carey    0.88  Musgrave 0.91  Musgrave
Apr02   0.91  Jones   0.93  Jones   0.99  Carey    0.94  Musgrave 0.95  Musgrave
...

リレーションの修飾

QDRを使用して、リレーション(非常に特殊な変数)を修飾することもできます。

region.districtリレーションが、districtによってディメンション化されるとします。districtを値Seattleで修飾する場合、式の値はSeattleのリレーションの値になります。QDRはdistrictの1つの値を指定するため、式の結果は単一のセルになります。

region.districtの定義は次のようになります。

DEFINE region.district RELATION region <district>
LD The region for each district

次の文によって、値WESTが表示されます。

SHOW region.district(district 'Seattle')

ディメンションの修飾

QDRを使用して、ディメンション自身を修飾でき、それによって式に1つのディメンション値を指定できます。次の式では、districtの1つの値(単一セル変数mydistrictに含まれる値)が指定されています。

district(district mydistrict)

連結ディメンションは、連結ディメンションのベース・ディメンションの1つから値を指定することにより、QDRを使用してディメンションを修飾できます。次の式では、ベース・ディメンションとしてregionおよびdistrictを持つ連結ディメンションreg.dist.ccdimの1つの値を指定します。コスト変数は、divisionおよびreg.dist.ccdimディメンションによってディメンション化されます。

SHOW reg.dist.ccdim(district 'Boston')

この式により次の結果が返されます。

<DISTRICT: Boston>

QDRとアンパサンド置換の使用

式の先頭にあるアンパサンド文字(&)は、文の式自体のかわりに式の値を置換します。QDRとともにアンパサンドを使用する場合、置換が行われる前に変数を修飾するには、式全体をカッコで囲む必要があります。

reptypeによってディメンション化され、変数名を含むmyvarという名前のテキスト変数があるとします。これは、reptypeによってディメンション化されたmyvarであり、myvarという名前の変数ではない点に注意してください。そのため、myvarを修飾して、結果の値をREPORT文で使用するためには、カッコで囲む必要があります。

REPORT &(myvar(reptype 'actual'))

カッコを使用せず、myvarで指定された変数がsalesの場合、salesreptypeによってディメンション化されないことを示すエラー・メッセージを受け取ります。

式における空のセルでの処理

アナリティック・ワークスペースにあるデータ・オブジェクトの一部のセルが空になる場合があります。特定のデータ値がセルに代入されていないか、またはデータ値がそのセルに適していない場合、空のセルになります。オブジェクトの空のセルの値はNAです。NA値には、特定のデータ型がありません。一部のファンクション(たとえば集計ファンクションなど)は、そのファンクションで必要な情報が使用できない、または適していない場合、NA値を返します。同様に、値が適していない式の値はNAになります。


注意:

OLAP DMLのコンポジット・ディメンションでディメンション化された変数(NULLファクトを持つリレーショナル・ファクト表に対応する変数)をサポートするため、OLAPでは、NA2ビットにより制御される特殊なNA値を使用できます。NA2ビットにより制御されるNA値のOracle OLAPにおける管理方法の詳細は、「NA2ビットとNULLトラッキング」を参照してください。

NA値の指定

使用できるデータがない場合の処理を指定することがあります。たとえば、変数の特定のセル、ファンクションの戻り値、または算術演算子を含む式の値として、適切な値が存在しない場合があります。このような場合、NA(使用不可)値が自動的に指定されます。

変数またはリレーションの値をNAに設定するには、次の例に示すように代入文(SET)を使用します。

sales = NA

NA値の処理方法の制御

NA値の処理方法を制御するオプションやファンクションは数多くあります。例を次に示します。

  • 「カテゴリ別のオプション」にリストされているNAオプション。

  • NAFILLファンクションは、指定した埋込み式で表示されるNA値とともにソース式の値を返します。このファンクションを式で使用すると、返す値の書式を制御できます。

  • 第5章「Oracle DMLプロパティ」にリストされているシステム・プロパティ。

数式

数式は、いずれかの数値データ型として評価されます。数式内のデータは、次のいずれかの組合せになります。

  • 数値リテラル(「数値データ型」を参照)

  • 数値変数または計算式

  • ディメンション

  • 数値結果を生成するファンクション

  • 日付リテラル、変数、計算式またはファンクション

さらに、算術演算子でこれらの式を結合して、より複雑な数式を作成できます。数値データを含む数式で算術演算子を使用すると、結果が数値で返されます。日付および数値データの両方が混在した日付式で、一部の算術演算子を使用することによって、結果を日付または数値のいずれかで取得できます。

Oracle OLAPによる数式の処理方法を決定する多くのオプションがあります。

数値データ型の混在

1つの数式には、すべての数値データ型を含めることができます。

結果のデータ型は、次のルールによって決定されます。

  • 式のすべてのデータがINTEGERまたはSHORTINTEGERで、演算が加算、減算および乗算のみの場合、結果はINTEGERとなります。

  • データのいずれかがNUMBERの場合、結果はNUMBERとなります。

  • データのいずれかがDECIMALまたはSHORTDECIMALで、NUMBERのデータがない場合、結果はDECIMALとなります。

  • 除算または指数演算を実行した場合、結果はDECIMALとなります。

算術式におけるテキスト・ディメンションの使用方法

データ型がTEXTであるディメンションを数式で使用する場合、そのディメンション値は位置(INTEGER)として処理されるため、数値と同じように使用されます。位置番号は、現行のステータスではなく、デフォルトのステータス・リストに基づきます。

浮動小数点計算の制限

小数値データは、格納および計算される際には必ず浮動小数点形式に変換されます。浮動小数点形式では、数値は仮数および指数を使用して表されます。仮数および指数は、2進数として格納されます。仮数とは、2を指数で累乗した値に乗算すると、元の小数値と等しい数値またはほぼ等しい数値が得られる2進部分のことです。

小数で1/3の正確な表現がないのと同様、小数値の端数部分は常に正確に2進表現されるとは限りません。つまり、小数値の端数部分を常に2進部分として正確に表現できるわけではありません。浮動小数点数の算術演算はさらに概算になる可能性があり、誤差は演算を重ねるごとに徐々に大きくなります。概算要因に加えて、有効桁の有効数が結果の精度に影響します。

これらすべての理由から、TOTAL、AVERAGE、またはDECIMALまたはSHORTDECIMAL変数の他の集計ファンクションにより計算される結果は、最後の有効数字が示す値が手動で計算した場合の結果と異なることがあります。SHORTDECIMALデータ型の有効桁数は最大7桁であるため、SHORTDECIMALデータとの誤差がさらに大きくなります。このため、通貨額を含む変数など、計算速度よりも精度が重要な場合はNUMBERデータ型を使用してください。

2進小数部で正確に表現できない一部の小数値の端数部分については、DECIMALデータ型を使用すると、有効桁数が多いためSHORTDECIMALデータ型よりもより正確な値が得られます。そのため、SHORTDECIMALおよびDECIMALデータ型が比較式で混在している場合に、問題が発生する可能性があります。このような比較を処理する方法の詳細は、「ブール式」を参照してください。

計算中のエラーの制御

次のタイプのエラーを制御できます。

  • 0(ゼロ)による除算。NA値を0で除算すると、結果はNAとなりエラーは発生しません。非NA値を0で除算すると、通常エラーが発生します。ディメンション化されたデータで計算を実行しているときに、0による除算のエラーが発生すると、不完全な結果になる可能性があります。REPORTまたは代入文(SET)を使用すると、計算されるたびに値がレポートまたは格納されるため、0(ゼロ)で除算した場合はすべての値を処理する前にループ処理が停止されます。

    0(ゼロ)による除算のエラーを防ぐために、DIVIDEBYZEROオプションの値をYESに変更できます。これは、0による除算の結果がすべてNAとなり、エラーが発生しないことを意味します。これにより、ディメンション化された式の他の値が継続して計算されます。

  • 負数のルート。負数のルート(整数以外の数値で累乗した場合を含む)を取得しようとすると、通常はエラーが発生します。エラーを抑止し、式の負数値以外のルートを継続して計算するためには、ROOTOFNEGATIVEオプションの値をYESに設定します。

  • オーバーフロー・エラー。DECIMALOVERFLOWオプションは、DIVIDEBYZEROと同様に機能します。計算によって処理できないほど大きい小数値の結果が返される場合に、エラーを生成するかどうかを制御できます。

テキスト式

テキスト式は、TEXTNTEXTまたはIDデータ型のデータとして評価されます。テキスト式は、次のいずれかの組合せになります。

  • テキスト・リテラル(例: 'Boston'または'Current Sales Report'

  • テキスト・ディメンション(例: districtまたはmonth

  • テキスト変数または計算式(例: product.name

  • テキスト結果を生成するファンクション(例: JOINLINES('Product: ' product.name)

テキスト式の言語

Oracle OLAPでは、NLS_LANGUAGEオプションで指定可能な任意の言語を使用したテキスト式がサポートされています。また言語ディメンションにより、複数言語のプログラムおよびアプリケーションもサポートされています。

テキスト式におけるDATETIME値の処理

テキスト値(TEXTNTEXTまたはID)が予想される場所でDATETIME値を使用するか、テキスト変数にDATETIME値を格納すると、DATETIME値は自動的にテキスト値に変換されます。

DATETIME値の書式は、NLS_DATE_FORMATオプションにより制御されます。DATETIME値をテキスト変数に格納すると、NLS_DATE_FORMAT設定は無効になります。

NTEXTデータの処理

TEXTおよびNTEXTデータは、ほとんどの場合に区別なく使用できます。ただし、NTEXT値がTEXT変数に代入された場合などに、暗黙的に変換が行われる可能性があります。TEXTNTEXTに変換される場合、NTEXTデータ型のUTF-8文字コードには他のほとんどのデータ型が含まれるため、データの消失は発生しません。しかし、NTEXTTEXTに変換される場合、NTEXT文字がワークスペースのキャラクタ・セットに示されていない場合はデータの消失が発生します。

TEXT値およびNTEXT値が同時に使用される場合(たとえばJOINCHARSファンクションへのコールにおいてなど)、TEXT値がNTEXTに変換され、NTEXT値が返されます。

日時式と期間式

「日時データ型と期間データ型」で説明されているように、OLAP DMLでは、SQLでサポートされているものと同じ日時データ型および内部データ型がサポートされます。この項では次の内容について説明します。

日時式

日時式は、日時データ型のいずれかの値を生成します。日時式の構文は次のとおりです。

datetime_value_expr AT LOCAL |

TIME ZONE { ' [ + | - ] hh:mm' | DBTIMEZONE | 'time_zone_name' | expr }

datetime_value_exprは、日時式、または日時値を生成する複合式になります。日時および期間は、表2-7「日時フィールドと値」での定義に従って組み合せることができます。日時値を生成する3つの組合せは、日時式で有効です。

AT LOCALを指定すると、現行のセッションのタイムゾーンが使用されます。

AT TIME ZONEの設定は、次のように解釈されます。

  • 文字列'(+|-)HH:MM'はUTCのオフセットとしてタイムゾーンを指定します。

  • DBTIMEZONE: データベースの作成時に(明示的またはデフォルトで)設定されるデータベースのタイムゾーンが使用されます。

  • SESSIONTIMEZONE: デフォルトまたは最新のALTER SESSION文で設定されたセッションのタイムゾーンが使用されます。

  • time_zone_name: time_zone_nameで指定されたタイムゾーンのdatetime_value_exprが返されます。有効なタイムゾーン名を表示するには、V$TIMEZONE_NAMES動的パフォーマンス・ビューを問い合せます。


    注意:

    夏時間機能には、タイムゾーン地域名が必要です。地域名は、2つのタイムゾーン・ファイルに格納されます。デフォルトのタイムゾーン・ファイルは、パフォーマンスを最大にするために一般的なタイムゾーンのみを含む小さなファイルです。タイムゾーンがデフォルトのファイルに存在しない場合は、環境変数ORA_TZFILEを使用して完全な(大きい)ファイルへのパスを指定しないかぎり、夏時間はサポートされません。

  • expr: exprが有効なタイムゾーン書式で文字列を返す場合、そのタイムゾーンで入力が返されます。そうでない場合は、エラーが返されます。

期間式

期間式は、DSNTERVALまたはMYINTERVALの値を生成します。式の構文は次のとおりです。

interval_value_expr DAY [(leading_field_precision)] TO

SECOND [(fractional_second_precision)]| YEAR [(leading_field_precision)] TO MONTH

interval_value_exprは、値DSNTERVALまたはMYINTERVAL、または値DSNTERVALまたはMYINTERVALを生成する複合式になります。日時および期間は、表2-7「日時フィールドと値」での定義に従って組み合せることができます。期間値を生成する6つの組合せは、期間式で有効です。

leading_field_precisionおよびfractional_second_precisionは両方とも、0〜9の任意の整数になります。DAYまたはYEARのいずれかでleading_field_precisionを省略すると、デフォルト値である2が使用されます。SECONDでfractional_second_precisionを省略すると、デフォルト値である6が使用されます。問合せで返された値にデフォルトの精度を超える桁数が含まれる場合、エラーが返されます。したがって、問合せで返される値以上の精度を指定することをお薦めします。

日時と期間の演算

算術演算は、日付(DATETIME)、タイムスタンプ(TIMESTAMPTIMESTAMP_TZおよびTIMESTAMP-LTZ)および期間(DSINTERVALおよびYMINTERVAL)のデータで実行できます。Oracleでは、次のルールに従って結果が計算されます。

  • 日付値およびタイムスタンプ値(期間値は除く)の算術演算で、NUMBER定数を使用できます。Oracleでは、タイムスタンプ値が日付値に内部的に変換され、日時および期間の算術式ではNUMBER定数が日数として解釈されます。たとえば、SYSDATE + 1は、明日になります。SYSDATE - 7は、1週間前になります。SYSDATE + (10/1440)は、現時刻の10分後になります。SYSDATEからサンプル表employeeshire_date列を減算すると、各従業員を雇用した時点からの経過日数が返されます。日付値やタイムスタンプ値の乗算および除算はできません。

  • Oracleでは、オペランドBINARY_FLOATおよびBINARY_DOUBLENUMBERに暗黙的に変換されます。

  • DATETIME値には時刻要素が格納され、多くの場合、日付操作の結果には小数部が含まれます。この小数部は、1日の一部分を意味します。たとえば、1.5日は36時間です。小数部は、DATETIMEデータの一般的な操作を行うOracle組込みファンクションによっても返されます。たとえば、MONTHS_BETWEENファンクションは、2つの日付間の月数を返します。結果の小数部は、月(1か月は31日)の一部分を表します。

  • 1つのオペランドがDATETIME値または数値である場合(タイムゾーンおよび小数部要素のいずれも含まない場合)、次のようになります。

    • Oracleでは、他方のオペランドが暗黙的にDATETIMEデータに変換されます。(ただし、数値と期間を掛けて期間を返す乗算を行う場合は除きます。)

    • 他方のオペランドがタイムゾーン値を持つ場合、戻り値にはセッションのタイムゾーンが使用されます。

    • 他方のオペランドが小数秒値を持つ場合、その小数秒値は失われます。

  • DATETIMEデータ型専用の組込みファンクションにタイムスタンプ値、期間値または数値が渡されると、DATETIME値以外の値は暗黙的にDATETIME値に変換されます。

  • 期間の計算で日時値が返される場合、その結果は実際の日時値である必要があります。実際の日時の値でない場合、データベースからエラーが返されます。

  • Oracleでは、すべてのタイムスタンプの演算はUTC時間で実行されます。TIMESTAMP_LTZでは、日時値がデータベースのタイムゾーンからUTCに変換され、演算を実行した後にデータベースのタイムゾーンに再変換されます。TIMESTAMP_TZでは、日時値は常にUTCであるため、変換は必要ありません。

表2-13「日時演算のマトリックス」に、日時演算操作のマトリックスを示します。ダッシュはサポートされていない操作を表します。

表2-13 日時演算のマトリックス

オペランドおよび演算子 DATETIME TIMESTAMP INTERVAL 数値

DATETIME





+



DATETIME

DATETIME

-

DATETIME

DATETIME

DATETIME

DATETIME

*





/





TIMESTAMP





+



TIMESTAMP


-

INTERVAL

INTERVAL

TIMESTAMP

TIMESTAMP

*





/





INTERVAL





+

DATETIME

TIMESTAMP

INTERVAL


-



INTERVAL


*




INTERVAL

/




INTERVAL

数値





+

DATETIME

DATETIME


NA

-




NA

*



INTERVAL

NA

/




NA


日付のみの式

日付のみの式は、OLAP DMLのDATEデータ型として評価される式です(「日付のみのデータ型」を参照)。この式は、日付のみの値、日付のみのリテラル、またはより複雑な式を返すファンクションのいずれかです。

日付のみの値の計算

DATE値に対して、数値を加算または減算できます。整数は日として計算され、小数は一日の端数として計算されます。たとえば、SYSDATE+1.5は現在の日付および時刻に1日と12時間を加算します。DATE値の乗算および除算はできません。数値からこれらの値を減算することもできません。たとえば、1-SYSDATEおよび1*SYSDATEはエラーになります。

算術式における日付のみの値の使用

算術式でDATE値を使用する場合、結果は数値または日付になります。日付の有効な演算と結果のデータ型の概要を、表2-14「DATE値の有効な演算」に示します。

表2-14 DATE値の有効な演算

演算 結果

日付に数値を加算または減算

未来または過去の日付

日付から日付を減算

日付間の日数

期間に数値を加算または減算

LEADファンクションまたはLAGファンクションの戻り値と同様、未来または過去における適切な間隔を持った期間。結果に対応するディメンション値が存在しない場合、結果はNAとなる。計算は、ディメンションのデフォルトのステータス・リストにおける値の位置に基づいて行われる。


ブール式

ブール式は、TRUEまたはFALSEの論理文です。ブール式では、比較する両方の式の基本データ型が同じであれば、すべての型のデータを比較できます。データをテストし、他のデータと等しい、より大きい、またはより小さいかを調べることができます。

ブール式は、次のようなブール・データで構成されます。

  • BOOLEAN値(YESNO、さらにそれらのシノニムであるONOFFTRUEFALSE

  • BOOLEAN変数または計算式

  • BOOLEAN結果を生成するファンクション

  • 比較演算子によって計算されるBOOLEAN

たとえば、コードに次のブール式が含まれているとします。

   actual GT 20000

この式では、Oracle OLAPは変数actualの各値を定数20,000と比較します。値が20,000より大きい場合に文はTRUEとなり、値が20,000以下の場合に文はFALSEとなります。

ブール値を指定する際、真の値にはYESONまたはTRUEのいずれかを、偽の値にはNOOFFまたはFALSEのいずれかを入力できます。ブール計算の結果が返される場合、デフォルトはNLS_LANGUAGEオプションで指定した言語でのYESおよびNOとなります。読取り専用のYESSPELLおよびNOSPELLオプションを指定すると、YESおよびNO値が記録されます。

比較演算子および論理演算子は、表2-11「比較演算子および論理演算子」にリストされています。各演算子には優先順位があり、その順位によって評価の順序が決定されます。カッコで評価の順序を変更しないかぎり、優先順位の等しい演算子は、左から右に評価されます。ただし、真の値が確定した時点で、評価は停止されます。たとえば、次の式では、最初の句により式全体が真であると判断されるため、TOTALファンクションは実行されません。

      yes EQ yes OR TOTAL(sales) GT 20000

ブール式の作成

ブール式は、比較の対象となる2つの項とその間にある比較演算子の、計3つの部分からなる句です。ANDおよびOR論理演算子を使用して3つの部分を持つ式を結合することで、より複雑なブール式を作成できます。ANDまたはORで結合した各式は、それ自体が完全なブール式である必要があります。そのため、同じ変数を複数回指定する必要がある場合もあります。

たとえば、次の式は2番目の部分が不完全なため、有効ではありません。

   sales GT 50000 AND LE 20000

次の式は、両方の部分が完全であるため、有効です。

   sales GT 50000 AND sales LE 20000

複数のブール式を組み合せる場合、式の最初の部分で真の値が決定される場合でも、式全体を有効にする必要があります。式は、式全体がコンパイルされた後に評価されます。そのため、ブール式の2番目の部分に未定義の変数が存在する場合はエラーが発生します。

ブール式の意味を逆転させるには、式をカッコで囲んでNOT演算子を使用します。

次の2つの式は等価です。

   district NE 'BOSTON'
   NOT(district EQ 'BOSTON')

例2-2 ブール比較の使用

次の例は、Bostonにおける各製品の売上がリテラル量より大きかったかどうかを表示するレポートを示しています。

LIMIT time TO FIRST 2
LIMIT geography TO 'BOSTON'
REPORT DOWN product ACROSS time: f.sales GT 7500

このREPORT文により次のデータが返されます。

CHANNEL: TOTALCHANNEL
GEOGRAPHY: BOSTON
               ---F.SALES GT 7500---
               --------TIME---------
PRODUCT          Jan02      Feb02
-------------- ---------- ----------
Portaudio              NO         NO
Audiocomp             YES        YES
TV                     NO         NO
VCR                    NO         NO
Camcorder             YES        YES
Audiotape              NO         NO
Videotape             YES        YES

ブール式におけるNA値の比較

ブール式で比較するデータにNA値が含まれている場合でも、それがブール式として意味を持てばYESまたはNOという結果が返されます。たとえば、NA値が非NA値と等価であるかどうかをテストすると、結果はNOとなります。ただし、結果が紛らわしい場合はNAが返されます。たとえば、NA値が非NA値より小さいか大きいかをテストすると、結果はNA値となります。

表2-15「NA値を含むブール式で結果が非NA値となる場合」に、NA値を含むブール式のうち、非NA値を生成する式の結果を示します。

表2-15 NA値を含むブール式で結果が非NA値となる場合

結果

NA EQ NA

YES

NA NE NA

NO

NA EQ non-NA

NO

NA NE non-NA

YES

NA AND NO

NO

NA OR YES

YES


数値データを比較する際のエラーの制御

数値データを比較する際に予期しない結果が返された場合は、その原因として次のような事柄が考えられます。

  • DECIMALSオプションが設定されているため、比較している数値の1つに、出力に表示されない小数の下位の桁が含まれている場合

  • 2つの浮動小数点数を比較しており、少なくとも1つの数値が算術演算の結果生成されたものである場合

  • 比較でSHORTDECIMALおよびDECIMALデータ型を混在させている場合

ABSおよびROUNDファンクションを使用して近似等価テストを行い、予期しない比較エラーを発生させる3つの原因すべてを回避することをお薦めします。ABSまたはROUNDを使用する場合、絶対誤差または四捨五入係数をアプリケーションに適した値に調整できます。計算速度を重視する場合は、ROUNDファンクションではなくABSファンクションを使用することをお薦めします。

数値精度によるエラーの制御

expenseは、値が計算により設定される小数値変数であるとします。計算の結果が100.000001で、小数点以下を2桁とすると、出力される値は100.00です。ただし、次の文の出力ではNOが返されます。

SHOW expense EQ 100.00

ABSまたはROUNDファンクションを使用すると、比較を行う際にそのようなわずかな誤差を無視できます。

浮動小数点数を比較する際のエラーの制御

コンピュータ言語で浮動小数点数を使用する際の一般的な限界として、比較する2つの浮動小数点数のどちらかが算術演算により得られた値である場合、両者が完全に一致することはほとんどありません。たとえば、一部のシステムでは、次の文によってYESではなくNOが返されます。

SHOW .1 + .2 EQ .3

小数値データを扱う場合は、それらを直接比較するコードは作成せず、ABSファンクションまたはROUNDファンクションを使用します。これらのファンクションを使用すると、誤差が一定の範囲内であれば、近似する2つの値を等しいとみなすことができます。たとえば、次の2つの文はどちらもYESが返されます。

SHOW ABS((.1 + .2) - .3) LT .00001
SHOW ROUND(.1 + .2) EQ ROUND(.3, .00001)

異なる数値データ型を比較する際のエラーの制御

端数部分を含む小数値については、SHORTDECIMAL表現とDECIMAL表現またはNUMBER表現は、厳密には一致しないと考える必要があります。これは、正確に表現できない端数部分を近似する有効桁数が、SHORTDECIMALデータ型よりもDECIMALデータ型およびNUMBERデータ型の方が多いためです。

SHORTDECIMALデータ型の変数を定義して、それを端数小数値に設定した後、次のようにそのSHORTDECIMAL数値を端数小数値と比較するとします。

DEFINE sdvar SHORTDECIMAL
sdvar = 1.3
SHOW sdvar EQ 1.3

この比較では、NOが返されると考えられます。ここでは、リテラルは自動的にDECIMAL型として認識され、SHORTDECIMAL型変数sdvarDECIMAL型に変換されます。このとき、小数部分を拡張するため末尾に0がいくつか追加されます。その後、ビット単位の比較が実行され、失敗します。DECIMALまたはNUMBERデータ型の変数を使用した同じ比較では、多くの場合YESが返されます。

このような比較エラーを回避するには、次のような方法があります。

  • 比較でSHORTDECIMALデータ型と、DECIMALまたはNUMBERデータ型を混在させないでください。この2つのデータ型の混在を防ぐには、通常、小数部分を含む変数をSHORTDECIMALとして定義しないようにします。

  • ABSファンクションまたはROUNDファンクションを使用して、近似する2つの値が等しいとみなされるようにします。次の文は、どちらもYESを返します。

    SHOW ABS(sdvar - 1.3) LT .00001
    SHOW ROUND(sdvar, .00001) EQ ROUND(.3, .00001)
    

ディメンション値の比較

同じディメンション内の値については、テキスト値に基づく比較は行われません。かわりに、Oracle OLAPはディメンションのデフォルト・ステータスにおける値の位置を比較します。これにより、次のような文を指定できます。

REPORT district LT 'Seattle'

文は、次のような過程で解析されます。

  1. テキスト・リテラル'Seattle'は、districtディメンションのデフォルトのステータス・リストにある位置に変換されます。

  2. その位置が、districtディメンションにある他のすべての値の位置と比較されます。

  3. 次のレポートに示すように、districtディメンションのデフォルトのステータス・リストでSeattleより前にある地区には値YESが返され、Seattle自体にはNOが返されます。

    REPORT 22 WIDTH district LT 'Seattle'
    
    District       DISTRICT LT 'Seattle'
    -------------- ----------------------
    Boston                            YES
    Atlanta                           YES
    Chicago                           YES
    Dallas                            YES
    Denver                            YES
    Seattle                            NO
    

より複雑な例では、最初の6か月に代入された初期値に基づいて、変数quotaに増分値が代入されます。比較は、monthディメンションの値の位置に基づいて行われます。このディメンションは時間ディメンションであるため、値は時系列になります。

quota = IF month LE 'Jun02' THEN 100 ELSE LAG(quota, 1, month)* 1.15

しかし、式region lt districtなど、異なるディメンションの値を比較する場合、共通分母はTEXTのみであるため、ディメンションの位置ではなくテキスト値が比較されます。

日付の比較

任意のブール比較演算子で2つの日付を比較できます。日付の場合、「より少ない」は「前」を意味し、「より大きい」は「後」を意味します。比較する式には、表2-11「比較演算子および論理演算子」に示す日付計算を含めることができます。たとえば、請求書アプリケーションでは、未払い請求書に対する督促状を送付するために、その日が請求日から60日以上経っているかどうかを判断できます。

bill.date + 60 LE SYSDATE

日付には、数値も使用できます。TO_NUMBERファンクションおよびTO_DATEファンクションを使用すれば、DATE値をINTEGER値に、あるいはINTEGER値をDATE値に変換して、両者を比較できます。

テキスト・データの比較

テキスト・データを比較する場合、記号、空白、大文字と小文字の違いなどを含め、テキストを正確に入力する必要があります。テキスト・リテラルは、一重引用符で囲む必要があります。たとえば、次の式では各従業員名の頭文字が文字「M」より後にあるかどうかをテストします。

EXTCHARS(employee.name, 1, 1) GT 'M'

TEXT値とID値を比較することは可能ですが、この2つの値が等しくなるのは長さが同じ場合のみです。テキスト値が他のテキスト値より大きいか小さいかをテストする場合、順序付けはNLS_SORTオプションの設定を基準として行われます。

最初に数値をテキストに変換することにより、数値とテキストを比較できます。順序付けは、文字の値を基準として行われます。テキストは左から右に評価されるため、予期しない結果が返されることがあります。たとえば、テキスト・リテラル1234100,999.00を比較した場合、前者の2番目の文字2は後者の2番目の文字0よりも大きいため、1234の方がより大きいという結果になります。

name.label3-Personという値を持つID変数であり、name.desc3-Person Tentsという値を持つTEXT変数であるとします。

次のSHOW文の結果は、NOとなります。

SHOW name.desc EQ name.label

次の文の結果は、YESとなります。

name.desc = '3-Person'
SHOW name.desc EQ name.label

テキスト値とテキスト・パターンの比較

ブール演算子LIKEは、テキスト値とテキスト・パターンの比較用の演算子です。対応する文字が一致している場合、テキスト値は他のテキスト値またはパターンと部分一致していることになります。

リテラルの一致に加えて、LIKEでは文字列の複数の文字に一致するワイルドカード文字を使用できます。

  • パターン内のアンダースコア(_)文字は、任意の1文字に一致します。

  • パターン内のパーセント(%)文字は、最初の文字列の0文字または任意の数の文字に一致します。

たとえば、%AT_のパターンは、文字ATの前に0文字または任意の数の文字が含まれ、後ろに1文字が含まれるテキストに一致します。LIKEを使用してDATAおよびERRATAをパターン%AT_と比較すると、両方の場合にYESが返されます。

LIKE演算子を使用した式の結果は、LIKECASEオプションおよびLIKENLオプションの設定により異なります。

LIKEには、否定演算子が存在しません。否定演算を実行するには、式全体を否定する必要があります。たとえば、次の文の結果はNOとなります。

SHOW NOT ('Boston' LIKE 'Bo%')

テキスト・リテラルとリレーションの比較

テキスト・リテラルとリレーションを比較することもできます。リレーションには、関連ディメンションの値が含まれており、テキスト・リテラルはそのディメンションの値と比較されます。たとえば、region.districtregionの値を含むため、次の比較を行うことができます。

region.district EQ 'West'

条件式

条件式は、条件に基づいて値を選択する際に使用します。条件式は、データ型が適切であれば、他の式の一部として使用できます。Oracle OLAPでは、次の条件式を使用できます。

IF...THEN...ELSE式

IF式は、ブール条件に基づいて2つの値のうちどちらか一方を選択する際に使用します。


注意:

IF式を、Oracle OLAPプログラムで使用するIF...THEN...ELSEコマンドと混同しないでください。構文は似ていますが、目的が異なります。IF...THEN...ELSEコマンドはデータ型を持たず、式のように評価されることはありません。

IF式の構文は次のとおりです。

IF Boolean-expression THEN expression1 ELSE expression2

ほとんどの場合、expression1およびexpression2のデータ型は、同じ基本的なデータ型(数値、テキストまたはブール)であることが必要であり、式全体のデータ型はバイナリ演算子の場合と同じルールに従って決定されます。ただし、expression1またはexpression2のどちらかのデータ型がDATEである場合、他方の式は数値またはテキストのデータ型にできます。Oracle OLAPでは両方のデータ型がDATEである必要があるので、数値またはテキスト値はDATEに変換されます。また、一方の式の値がディメンション値であれば、もう一方の式の値もQDR用としてディメンション値に変換されます。

IF式はネストできますが、この場合、SWITCH式を使用することもできます(「SWITCH式」を参照)。

IF式では、まずブール式が評価され、その後で次のような処理が実行されます。

  • ブール式の結果がTRUEの場合、expression1が評価され、その値を返します。

  • ブール式の結果がFALSEの場合、expression2が評価され、その値を返します。

expression1引数およびexpression2引数には、同じ基本データ型に評価される任意の有効なOLAP DMLを指定できます。ただし、どちらかの値のデータ型がDATEの場合、もう一方の値に数値データ型またはテキスト・データ型を指定できます。両方のデータ型をDATEにする必要があるため、Oracle OLAPは数値またはテキスト値をDATEに変換します。式全体のデータ型は、2つの式と同じになります。ブール式の結果がNAの場合、NAを返します。

例2-3 IF式の使用

例として、売上ボーナスのレポートを示します。売上が予算を上回った場合、ボーナスはその上回った額の5パーセントですが、地区の売上が予算を下回った場合はボーナスが0(ゼロ)になります。

LIMIT month TO 'Jan02' TO 'Jun02'
LIMIT product TO 'Tents'
REPORT DOWN district IF sales-sales.plan LT 0 THEN 0
       ELSE .05*(sales-sales.plan)

PRODUCT: TENTS
        ---IF SALES-SALES.PLAN LT 0 THEN 0 ELSE .05*(SALES-SALES.PLAN)---
          ----------------------MONTH------------------------------
DISTRICT   Jan02    Feb02    Mar02     Apr02    May02    Jun02
--------- -------- -------- -------- ------- --------- ----------
Boston      229.53     0.00     0.00    0.00    584.51     749.13
Atlanta       0.00     0.00     0.00  190.34    837.62   1,154.87
Chicago       0.00     0.00     0.00   84.06    504.95     786.81
...

SWITCH式

SWITCH式は、一連のCASE式で構成されています。SWITCH式は、1つの値に対してすべての条件と等価比較を行う場合に、複雑にネストされたIF ... THEN ... ELSE式のかわりに使用できます。


注意:

SWTICH式を、Oracle OLAPプログラムで使用するSWTICHコマンドと混同しないでください。構文は似ていますが、目的が異なります。SWITCHコマンドは、式のように評価されることはありません。

SWITCH式の構文は次のとおりです。

SWITCH expression DO { case-label ... exp [,] } ...DOEND

ここで、case-labelの構文は次のとおりです。

CASE exp: | DEFAULT:

SWITCH式では、一致が見つかるまで各CASE式との比較が行われます。一致が見つかると、現行のCASEグループの最後のラベルの後に指定された値が返されます。一致が見つからない場合、DEFAULTラベルが指定されていると、DEFAULT部で指定されている値が返されます。DEFAULTラベルが指定されていない場合は、NAが返されます。

例2-4 IF式のかわりにSWITCH式を使用した場合

ネストしたIF...THEN...ELSE文を含む次のようなOLAP DML文を作成したとします。

   testprogram = IF testtype EQ 0 -
                THEN 'program0' -
                ELSE IF testtype EQ 1 -
                  THEN 'program1' -
                  ELSE IF testtype EQ 2 OR testtype EQ 3 -
                    THEN 'program2'
                    ELSE NA

これを次のように、SWITCH式を使用して同じ動作を行うコードに書き換えることができます。

   testprogram = SWITCH testtype DO -
                CASE 0: 'program0', -
                CASE 1: 'program1', -
                CASE 2: -
                CASE 3: 'program2', -
                DEFAULT: NA -
                DOEND

また、カンマやDEFAULT部を省略して行数を減らしたSWITCH文を使用しても同様の書換えが可能です。一致が見つからない場合のデフォルトの戻り値は、NAです。

   testprogram = SWITCH testtype DO CASE 0: 'program0' CASE 1: 'program1' -
              CASE 2: CASE 3: 'program2' DOEND

置換式

置換式を作成するには、式の先頭にアンパサンド文字(&)を使用します。アンパサンド(置換演算子)を使用するので、アンパサンド置換とも呼ばれています。アンパサンドを指定すると、Oracle OLAPは置換式を含む式を次の手順で評価します。

  1. 先頭にアンパサンドが付いている式(置換式)を評価します。

  2. 手順1の結果(置換式の結果)を使用して、式の残りの部分を評価します。

アンパサンド置換により、式を指定するときに間接的なレベルを指定できます。たとえば、アンパサンドの後に、他の変数の名前を含む変数を指定すると、その式の値は、その名前を持つ変数に含まれているデータになります。アンパサンド置換により、プログラムの実行時に処理するデータを選択できる、より汎用的なプログラムを記述できるようになります。ただしOracle OLAPでは、アンパサンド置換を含む行はコンパイルされません。このような行は、プログラム実行時に解釈が行われます。通常は、IFコマンドやSWITCHコマンドを使用すれば、プログラム内にアンパサンド置換を使用する必要がなくなります。

モデル方程式では、アンパサンド置換を使用できません。

例2-5 アンパサンド置換の使用

curnameという変数には、アナリティック・ワークスペース内のあるディメンションの名前(product)が含まれているとします。次の文を実行すると、REPORTにより、curname変数に格納されている実際の値productが1つのみ生成されます。

REPORT curname

CURNAME
----------
PRODUCT

ただし、次の文を実行した場合は、REPORTによりディメンションproductの値が生成されます。

REPORT &curname

PRODUCT
--------------
Tents
Canoes
Racquets
Sportswear
Footwear

QDRとアンパサンド置換の使用

QDRとともにアンパサンドを使用する場合、置換が行われる前に変数を修飾するには、式全体をカッコで囲む必要があります。

reptypeによってディメンション化され、変数名を含むmyvarという名前のテキスト変数があるとします。これは、reptypeによってディメンション化されたmyvarであり、myvarという名前の変数ではない点に注意してください。そのため、myvarを修飾して、結果の値をREPORT文で使用するためには、カッコで囲む必要があります。

REPORT &(myvar(reptype 'actual'))

カッコを使用せず、myvarで指定された変数がsalesの場合、salesreptypeによってディメンション化されないことを示すエラー・メッセージを受け取ります。