13.4 JSON_TRANSFORMの演算子APPEND

JSON_TRANSFORMの演算子APPENDは、配列に値を追加します。

これは、その操作のRHSで指定されている値を、LHSのパス式で対象となっている配列に追加します。これは、RHSのパス式で一致した、複数の値のシーケンスを受け入れることができます。

LHSのパス式が、配列でない値の既存のフィールドを対象としている場合はエラーが発生します。

RHSが配列を対象としている場合は、RHSの配列の要素を順番に追加することでLHSの配列が更新されます。例13-10を参照してください。

例13-9 要素を配列に追加してそれを末尾に挿入

このコードでは、配列aの末尾に文字列"hello"を追加しています。

SELECT json_transform('{"a":[1,2,3]}',
                      APPEND '$.a' = 'hello');

結果 — 変更された入力データ:

{"a":[ 1,2,3,"hello" ]}

演算子INSERTを使用するこのコードも同等です。APPENDは、last+1の配列位置に対するINSERTの効果があります。

SELECT json_transform('{"a":[1,2,3]}',
                      INSERT '$.a[last+1]' = 'hello');

例13-10 JSON_TRANSFORM: 変数の使用による配列への複数要素の追加

この例では、値5"cat"を、その順序で、各配列a.bに、つまり配列[ 1,2 ][ 3,4 ]に追加します。(これは、例13-24に似ています。)

追加する要素、およびそれらを追加する順序は、ここでは配列[ 5,"cat" ]によって指定されています。これはこの場合は、RHSのSQL式(SQL/JSONファンクションjson_arrayを呼び出す)を評価した結果です。

この配列は、SQL/JSON変数$varの値として演算子APPENDに渡されます。追加される要素は、すべての配列要素を順番に並べたものであり、RHSのパス式で[*]を使用して指定します。

SELECT json_transform('{"a": [ {"b": [ 1,2 ]},
                               {"b": [ 3,4 ]} ]}',
                      SET '$var' = json_array(5, 'cat'),
                      APPEND '$.a[*].b' = PATH '$var[*]');

結果 — 変更された入力データ:

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

ヒント:

ハンドラCREATE ON MISSINGを使用すると、LHSが対象とする欠落している配列値フィールドを作成して、RHSで指定された値から入力できます。次に例を示します:

SELECT json_transform('{"a":[1,2,3]}',
                      APPEND '$.b' = PATH '$.a[0,2]'
                      CREATE ON MISSING);

結果 — 変更された入力データ:

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

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

  • 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.