算術式

構文

add_expression ::= multiply_expression (("+"|"-") multiply_expression)*

multiply_expression ::= unary_expression (("*"|"/"|"div") unary_expression)*

unary_expression ::= path_expression | (("+"|"-") unary_expression)

セマンティクス

Oracle NoSQL Databaseは、算術演算の+、-、*、/およびdivをサポートしています。これらの演算子の各オペランドは、最大1つの数値項目を生成する必要があります。いずれかのオペランドから空の順序またはNULLが返された場合、算術演算の結果もそれぞれ空またはNULLになります。それ以外の場合、演算子は次のように計算される単一の数値項目を返します。
  • いずれかのオペランドが数値項目を返す場合、他のオペランドによって返される項目は数値にキャストされ(まだ数値でない場合)、結果はBigDecimalでjavaの算術式を使用して計算される数値項目になります。それ以外の場合、
  • いずれかのオペランドがdouble項目を返す場合、他のオペランドによって返される項目はdouble値にキャストされ(まだdoubleでない場合)、結果はdoubleでjavaの算術式を使用して計算されるdouble項目になります。それ以外の場合、
  • いずれかのオペランドがfloat項目を返す場合、他のオペランドによって返される項目はfloat値にキャストされ(まだfloatでない場合)、結果はfloatでjavaの算術式を使用して計算されるfloat項目になります。それ以外の場合、
  • div演算子を除き、いずれかのオペランドがlong項目を返す場合、他のオペランドによって返される項目はlong値にキャストされ(まだlongでない場合)、結果はlongでjavaの算術式を使用して計算されるlong項目になります。
  • div演算子を除いて、すべてのオペランドがinteger項目を返す場合、結果はintでjavaの算術式を使用して計算されるinteger項目になります。
  • div演算子は、両方のオペランドがlongまたはinteger、あるいはその両方である場合でも、浮動小数点除算を実行します。この場合、divはdoubleを返します。

Oracle NoSQL Databaseは、単項+演算子と–演算子もサポートしています。単項+はno-opで、単項–はその数値引数の符号を変更します。

例のとおりにする場合は、ユーザー・データおよび航空手荷物追跡アプリケーション表を作成し、「例で使用する表」の項の説明に従ってデータを挿入します。

例6-86 算術式

ユーザーごとに、IDおよび、実際の収入と、基本収入に年齢比例額を加えたものとして計算される収入との差を示します。

DECLARE
$baseIncome INTEGER;
$ageMultiplier DOUBLE;
SELECT id,
income - ($baseIncome + age * $ageMultiplier) AS adjustment
FROM Users

例6-87 航空手荷物追跡アプリケーション・データから、チケット番号が1762320369957である乗客の名前、トランジット回数をフェッチし、トランジット時間を計算します

SELECT bag.fullname AS NAME, $t-1 AS HOPS,
  CASE
    WHEN $t-1 = 2
    THEN get_duration(timestamp_diff($bagInfo.flightLegs[2].flightDate, $bagInfo.flightLegs[1].estimatedArrival) + timestamp_diff($bagInfo.flightLegs[1].flightDate, $bagInfo.flightLegs[0].estimatedArrival))
    WHEN $t-1 = 1        
    THEN get_duration(timestamp_diff($bagInfo.flightLegs[1].flightDate, $bagInfo.flightLegs[0].estimatedArrival))
    ELSE "Direct flight"
  END AS TRANSITHRS
FROM BaggageInfo bag, bag.bagInfo[0] AS $bagInfo,
size($bagInfo.flightLegs) $t
WHERE bag.ticketNo = 1762320369957

説明: BaggageInfo表では、JSONフィールドbagInfoに、各乗客のチェック済手荷物追跡情報が格納されます。乗客は、飛行機旅行中に複数回のトランジットを行う場合があります。flightLegs配列には、乗客の旅程内の各空港に関する情報が含まれます。flightLegs配列の各要素では、flightDateフィールドには出発地空港からの予定出発時間が保持され、estimatedArrivalフィールドには到着地空港での予定到着時間が保持されます。size関数を使用して、flightLegs配列のサイズを計算します。これは、乗客の飛行機旅行における移動区間の数です。ただし、このカウントには、最後の空港も含まれていますが、これは到着地であり、トランジット空港ではありません。乗客1人当たりのトランジット空港(ホップ)の数を計算するには、算術演算子'-'を使用して、最後の空港をカウントから減算します。問合せ全体の使用を容易にするために、サイズ計算を内部変数$t1に割り当てることができることに注意してください。変数の詳細は、「変数宣言」を参照してください。

各トランジットで乗客が費やした時間を計算するには、直後の到着地空港のflightDateと現在の空港のestimatedArrivalの間の期間を確認します。timestamp_diff関数を使用して、時間差を計算します。flightDateフィールドが最終到着地空港に属するまで、すべてのトランジットに対してこれを繰り返します。算術演算子「+」を使用して、個々のトランジット時間を追加して合計トランジット時間を算出します。get_duration関数を使用して、結果をミリ秒から時間文字列に変換します。ホップ数はすべての乗客に対して固定されていないため、ホップ数ごとにCASE式を条件とともに使用します。特定の乗客のホップ数に応じて、対応する条件が適用され、合計トランジット時間が計算されて結果に表示されます。ここでは、計算を容易にするために2回のホップについてのみ検討します。

乗客には複数の受託手荷物がある可能性があります。そのような場合は、bagInfo配列に複数の要素があります。結果が重複しないように、計算時にbagInfo配列の最初の要素(つまりbagInfo[0])のみを考慮に入れる必要があります。

出力:
{"NAME":"Lorenzo Phil","TRANSITHRS":"6 hours 8 minutes"}