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句の操作が順に実行されます。
ノート:
SQLのCASE式は、json_transformのCASE操作とは次の点で異なります:
-
SQLの
CASEの場合、テストされる述語はSQL比較です。json_transformのCASEの場合、述語は、なんらかのデータの存在をチェックするパス式です。(このチェックは基本的にjson_existsを使用して実行されます)。 -
SQLの
CASEの場合は、各THEN/ELSE分岐に、評価するSQL式が含まれています。その値が、CASE式の結果として返されます。json_transformのCASEの場合は、各THEN/ELSE分岐に、実行される一連のjson_transform操作(カッコで囲まれている)が含まれています。
例13-11 JSON_TRANSFORM: CASEとSETによる変更の制御
この例では、演算子CASEとSETを使用して条件付きでフィールド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式に関する項