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の演算子REMOVEKEEPは、次の意味で反対の効果があります:

  • 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