13.5 JSON_TRANSFORMの演算子CASE

JSON_TRANSFORMの演算子CASEは、条件付きで一連の操作を実行します。これは制御操作であり、条件付きでその他のjson_transform操作を適用し、それによってデータを変更できます。

CASE操作の構文は、演算子CASEの後に1つ以上のWHEN句、その後にオプションでELSE句、その後にキーワードENDです。

  • WHEN句は、キーワードWHENの後にパス式を続け、その後にTHEN句を続けます。

    パス式にはフィルタ条件を含めて、それによってデータが存在するかどうかをチェックします。

  • THEN句またはELSE句は、それぞれキーワードTHENまたはELSEの後に、0個以上のjson_transform操作が含まれたカッコ(())を続けます。

    THEN句の操作は、そのWHEN句の条件が満たされた場合に実行されます。オプションのELSE句の操作は、WHENなしの条件が満たされた場合に実行されます。

    ヒント: THEN句を操作を指定せずに使用すると、条件付きで後続の句が使用できなくなります。

WHEN句の条件付きパス式は、成功するまで順次テストされます(成功後のパス式はテストされません)。その後で、成功したWHENテストのTHEN操作が順次実行されます。

いずれのWHENテストも成功しない場合、オプションのELSE句の操作が順に実行されます。

ノート:

SQLCASE式は、json_transformCASE操作とは次の点で異なります:

  • SQLのCASEの場合、テストされる述語はSQL比較です。json_transformCASEの場合、述語は、なんらかのデータの存在をチェックするパス式です。(このチェックは基本的にjson_existsを使用して実行されます)。

  • SQLのCASEの場合は、各THEN/ELSE分岐に、評価するSQL式が含まれています。その値が、CASE式の結果として返されますjson_transformCASEの場合は、各THEN/ELSE分岐に、実行される一連のjson_transform操作(カッコで囲まれている)が含まれています。

例13-11 JSON_TRANSFORM: CASEとSETによる変更の制御

この例では、演算子CASESETを使用して条件付きでフィールドTotalPriceを設定し、それが存在しない場合はそれを作成します。データに適用されると、各WHENテストが、成功するまで順番に試行されます。その後、その成功したテストに対応するSET操作が実行されます。どのWHENテストも成功しなかった場合は、ELSE句が使用されます。

  • 最初のWHEN句は、5未満のQuantityフィールドのデータに適用されます。フィールドTotalPriceは、割引なしで計算されます。

  • 2番目のWHEN句は、5以上7未満のQuantityフィールドのデータに適用されます。フィールドTotalPriceは、10%の割引で計算されます。

  • どちらのWHENテストも成功しなかった場合は、ELSE句で、15%の割引でTotalPriceが計算されます。

    この句は、フィールドQuantityが存在しない場合や、7未満の比較が実施されない数値以外のJSON値である場合にも適用されます。

json_transform(
  data,
  NESTED PATH '$.LineItems[*]'
    ( CASE WHEN '@?(@.Quantity < 5)' THEN
             ( -- No discount
               SET '@.TotalPrice' = PATH '@.Quantity * @.Part.UnitPrice' )
           WHEN '@?(@.Quantity < 7)' THEN
             ( -- 10% discount
               SET '@.TotalPrice' = PATH '@.Quantity * @.Part.UnitPrice * 0.9' )
           ELSE
             ( -- 15% discount
               SET '@.TotalPrice' = PATH '@.Quantity * @.Part.UnitPrice * 0.85' )
      END ))

演算子CASEに使用できるハンドラはありません。(ただし、CASE分岐で使用されている演算子では、それらに使用可能なハンドラを使用できます。)

関連項目:

『Oracle Database SQL言語リファレンス』CASE式に関する項