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