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式に関する項