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のパスで一致した値3
と4
が、1つの単位としてまとめられ、LHSで対象となっている配列[1,2]
にAPPEND
(追加)された場合、結果は、その配列に要素3
と4
が個別に順々に追加された場合と同じになります。結果は、どちらの場合も[1,2,3,4]
です。3
を追加すると、4
は、3
と4
をまとめて追加することと同じになり、順番に並べられます。
しかしながら、PREPEND
の場合は、3
と4
をまとめて先頭に付加すると結果は[3,4,1,2]
になり、一方で、先頭に個別に順々に付加すると結果は[4,3,1,2]
になります。
PREPEND
の動作は次のとおりです: 値3
と4
は、その順序で、入力配列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 MISSING
、CREATE ON MISSING
、NULL ON MISSING
。 -
ERROR ON MISMATCH
(デフォルト)。 -
NULL ON NULL
(デフォルト)、IGNORE ON NULL
、ERROR ON NULL