13.8 JSON_TRANSFORMの演算子INTERSECT

JSON_TRANSFORMの演算子INTERSECTは、指定された一連の値にあるもの以外の配列要素を削除します。これは積集合操作です。

これは、RHS (右辺)で指定されている値と等しくない、LHS (左辺)のパス式で対象となっている配列の要素をすべて削除します。この操作は、右辺(RHS)のパス式で一致した、複数の値のシーケンスを受け入れることができます。

ノート: これは集合操作であるため、操作後のすべての配列要素の順序定義されていません

例13-16 JSON_TRANSFORM: 集合としての配列2つの論理積

結果であるオブジェクト内の配列aは、入力配列$.a$.bの積集合です。結果であるオブジェクト内の配列bは変更されていません。


SELECT json_transform('{"a":[ 1, 2, 3 ], "b":[ 2, 3, 4 ]}',
                      INTERSECT '$.a' = PATH '$.b[*]')

結果:

{"a":[ 3,2 ], "b":[ 2,3,4 ]}

RHSのパス式で[*]を使用して配列bの要素すべてが対象となっていることに注目してください。この例では、[*]を指定しなかった場合は、配列b全体が単一の値として扱われるため、{"a":[], "b":[2,3,4]}が返されます。配列aにはその値([2,3,4])が含まれていないため、この論理積は、空の集合(配列)になります。

ノート:

PREPENDおよびINTERSECTは、RHSパス式に一致する複数の値が個別に処理されるのではなく、ブロックとして完全に処理されることが本当に重要な唯一のLHS配列対象操作です。

たとえば、RHSのパスで一致した値34が、1つの単位としてまとめられ、LHSで対象となっている配列[1,2]APPEND (追加)された場合、結果は、その配列に要素34が個別に順々に追加された場合と同じになります。結果は、どちらの場合も[1,2,3,4]です。3を追加すると、4は、34をまとめて追加することと同じになり、順番に並べられます。

しかしながら、PREPENDの場合は、34をまとめて先頭に付加すると結果は[3,4,1,2]になり、一方で、先頭に個別に順々に付加すると結果は[4,3,1,2]になります。

PREPENDの動作は次のとおりです: 値34は、その順序で、入力配列a ([ 1,2 ])の先頭にまとめて付加されます。

SELECT json_transform('{"a":[ 1,2 ], b:[ {c:3}, {c:4} ]}',
                      PREPEND '$.a' = PATH '$.b[*].c')

結果:

{"a":[ 3,4,1,2 ], "b":[ {"c":3}, {"c":4} ]}}

UNIONと比較すると、INTERSECTには同じ考慮事項があります。複数のRHS値(少なくとも、異なる2つの値がある)がINTERSECTによって個別に処理された場合、結果は必ず、空の配列[]になります。実際には、シーケンス内の最初の値を処理した後、結果の交差はその値を持つ単一の配列になります。シーケンス内の次の値を処理すると、結果は空の論理積になります。

たとえば、[1,2,3,4]に対して、複数の値を個別に指定して(3、次に4)論理積を実行すると、まず[3]が生成され(3を除くすべてが削除される)、次に[]が生成されます(4を除くすべてが削除される)。

演算子INTERSECTで使用できるハンドラは次のとおりです:

  • ERROR ON MISSING (デフォルト)、IGNORE ON MISSINGCREATE ON MISSINGNULL ON MISSING

  • ERROR ON MISMATCH (デフォルト)。

  • NULL ON NULL (デフォルト)、IGNORE ON NULLERROR ON NULL