13.13 JSON_TRANSFORMの演算子PREPEND
JSON_TRANSFORM
の演算子PREPEND
は、値を配列の先頭に付加します。
これは、RHSで指定されている値を、LHSのパス式で対象となっている配列の先頭に付加します。これは、RHSのパス式で一致した、複数の値のシーケンスを受け入れることができます。
LHSのパス式が、配列でない値の既存のフィールドを対象としている場合はエラーが発生します。
単一の値を先頭に付加する場合、PREPEND
には、配列位置0
に対するINSERT
の効果があります。
RHSが配列を対象としている場合は、RHSの配列の要素を先頭に順番に追加することでLHSの配列が更新されます。
例13-23 JSON_TRANSFORM: 配列の先頭への要素の付加
このコードでは、入力配列a
([1,2]
)の先頭に文字列"hello"
を付加しています。
SELECT json_transform('{"a":[1,2]}',
INSERT '$.a' = '0')
結果:
{"a":[ 0,1,2 ]}
例13-24 JSON_TRANSFORMで変数を使用して配列の先頭に複数の要素を付加
この例では、値5
と"cat"
を、その順序で、各配列a.b
(つまり配列[ 1,2 ]
と[ 3,4 ]
)の先頭に付加します。(これは、例13-10に似ています。)
先頭に付加する要素、およびそれらを付加する順序は、ここでは配列[ 5,"cat" ]
によって指定されています。これはこの場合は、RHSのSQL式(SQL/JSONファンクションjson_array
を呼び出す)を評価した結果です。
この配列は、SQL/JSON変数$var
の値として演算子PREPEND
に渡されます。先頭に付加される要素は、すべての配列要素を順番に並べたものであり、RHSのパス式で[*]
を使用して指定されています。それらの要素はまとめて先頭に追加されるため、結果では、RHSの配列でのそれらの順序が反映されています。
SELECT json_transform('{"a": [ {"b": [ 1,2 ]},
{"b": [ 3,4 ]} ]}',
SET '$var' = json_array(5, 'cat'),
PREPEND '$.a[*].b' = PATH '$var[*]');
結果 — 変更された入力データ:
{"a":[ {"b":[ 5,"cat",1,2 ]},
{"b":[ 5,"cat",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
を除くすべてが削除される)。
演算子PREPEND
で使用できるハンドラは次のとおりです(演算子APPEND
の場合と同じです):
-
ERROR ON MISSING
(デフォルト)、IGNORE ON MISSING
、CREATE ON MISSING
、NULL ON MISSING
。作成は、対象となる場所に単一の配列を挿入することを意味します。単一の配列要素は、SQLの結果式の値です。 -
ERROR ON MISMATCH
(デフォルト)、IGNORE ON MISMATCH
、REPLACE ON MISMATCH
、CREATE ON MISMATCH
。 -
NULL ON NULL
(デフォルト)、IGNORE ON NULL
、ERROR ON NULL
-
IGNORE ON EMPTY
(デフォルト)、ERROR ON EMPTY
.