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.