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のパスで一致した値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を除くすべてが削除される)。

演算子PREPENDで使用できるハンドラは次のとおりです(演算子APPENDの場合と同じです):

  • ERROR ON MISSING (デフォルト)、IGNORE ON MISSINGCREATE ON MISSINGNULL ON MISSING。作成は、対象となる場所に単一の配列を挿入することを意味します。単一の配列要素は、SQLの結果式の値です。

  • ERROR ON MISMATCH (デフォルト)、IGNORE ON MISMATCHREPLACE ON MISMATCHCREATE ON MISMATCH

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

  • IGNORE ON EMPTY (デフォルト)、ERROR ON EMPTY.