13.14 JSON_TRANSFORMの演算子REMOVE
JSON_TRANSFORMの演算子REMOVEは、指定されたパス式1つ以上で対象となっている、入力データの部分をすべて削除します。
すべてのデータを削除しようとすると、エラーが発生します。つまり、REMOVE '$'は使用できません。デフォルトでは、対象となるデータが存在しない場合、エラーは発生しません(IGNORE ON MISSING)。
例13-25 JSON_TRANFORM: 位置による配列要素の削除
このコードでは、入力配列[0,1,2]から最初の要素(索引0)を削除しています。
SELECT json_transform('{"a":[0,1,2]}',
REMOVE '$.a[0]')
結果:
{"a":[ 1,2 ]}
例13-26 JSON_TRANSFORM: 述語を満たす配列要素の削除
この例では、部品のUPCCodeの値が85391628927であるすべての明細項目を削除します。これらはLineItems配列の要素であり、フィールドPartを含むオブジェクトです。また、このフィールド自体は、値85391628927のフィールドUPCCodeを含むオブジェクトです。IGNORE ON MISSINGがデフォルト・ハンドラであるため、対象となっているデータが存在しない場合は何も実行されません(エラーは発生しません)。
json_transform(data,
REMOVE '$.LineItems[*]?(@.Part.UPCCode == 85391628927)')
例13-27 JSON_TRANFORM: 述語を満たすフィールドの削除
このコードでは、最上位フィールド(配列) LineItemsに含まれている要素が、フィールドPartがあるオブジェクトであり、そのフィールド自体に値85391628927のフィールドUPCCodeが含まれている場合に、その最上位フィールド全体を削除しています。IGNORE ON MISSINGがデフォルト・ハンドラであるため、対象となっているデータが存在しない場合は何も実行されません(エラーは発生しません)。
json_transform(data,
REMOVE '$.LineItems?(@.Part.UPCCode == 85391628927)')
例13-27と例13-26の違いは[*]の有無のみであることに注目してください。
-
[*]を指定した場合は、述語に含まれている明細項目配列要素のみが削除されます。 -
[*]を指定しなかった場合は、LineItems配列に述語に含まれている要素があると、この配列全体が削除されます。
演算子REMOVEは例外です。つまり、それの後に複数のパス式を続けることができます。これは代入操作ではありません(=やRHSはありません)。
演算子SET (ハンドラCREATE ON MISSINGを使用)とINSERT (KEEPは除く)は、演算子REMOVEの逆とみなすことができます。
ノート:
JSON_TRANSFORMの演算子REMOVEとKEEPは、次の意味で反対の効果があります:
-
REMOVEは、指定されたパス式のどれかで対象となっている入力データを削除します。保持の観点で述べると、
REMOVEは、パス式のどれかで対象となっていない入力データを保持します。 -
KEEPは、指定されたパス式のどれかで対象となっている入力データ(のみ)を保持します。削除の観点で述べると、
KEEPは、パス式のどれかで対象となっていない入力データを削除します。
次のことに注意してください: REMOVEを連続的に使用してデータを徐々に削除していくことができますが、KEEPではこのようにできません。
たとえば、入力データが{"b":"bird", "c":"cat", "d":"dog", "h":"horse"}であるとします。
REMOVE '$.c' // Result: {"b":"bird", "d":"dog", "h":"horse"}
REMOVE '$.d' // Result: {"b":"bird", "h":"horse"}
KEEP '$.b' // Result: {"b":"bird"}
KEEP '$.h' // No field h to keep. By default (IGNORE ON MISSING), no error is raised.
様々なパス式に一致するデータを保持するには、これらの式を同じKEEP操作でまとめて使用する必要があります。
KEEP '$.b', '$.h' // Result: {"b":"bird", "h":"horse"}
(保持するデータを連続的に減らしていくには、KEEPの呼出しごとに、指定するパス式のサブセットを小さくしていく必要があります。これは便利でも実用的でもありません。)
演算子REMOVEで使用できるハンドラは次のとおりです:
-
REMOVE ON EXISTING(デフォルト) -
IGNORE ON MISSING(デフォルト)、ERROR ON MISSING