SQLiteでは、json_patch()
関数を使用して、JSONオブジェクトの要素を追加、変更、または削除できます。
これを行うには、RFC-7396 MergePatchアルゴリズムを実行して、特定のJSON入力に対して特定のパッチを適用します。
関数を呼び出すときの最初の引数として元のJSONを渡し、その後にパッチを渡します。次に、関数は最初の引数でそのパッチをJSONに対して適用します。
構文
構文は次のようになります:
json_patch(T,P)
ここでT
元のJSONを表し、P
パッチです。この関数はパッチP
を適用します T
に対して 。
提供されたパッチの内容P
ターゲットJSONドキュメントの現在のコンテンツと比較されますT
。 P
の場合 T
に表示されないメンバーが含まれています 、それらのメンバーが追加されます。 T
の場合 メンバーが含まれている場合、値が置き換えられます。
P
のヌル値 T
の既存の値の削除を示す特別な意味が与えられます 。
例
実例をいくつか示します。
挿入
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : 10 }');
結果:
{"name":"Fluffy","age":10}
null値で新しいメンバーを挿入しようとしても機能しません:
SELECT json_patch('{ "name" : "Fluffy" }', '{ "age" : null }');
結果:
{"name":"Fluffy"}
ヌル値は、実際にはJSONからメンバーを削除するために使用されます(後の例で見られるように)。
更新
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy" }');
結果:
{"name":"Baldy"}
複数のキーと値のペアがあり、そのうちの1つだけを更新する場合は、2番目の引数でそのペアを指定するだけです。
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "name" : "Baldy" }');
結果:
{"name":"Baldy","age":10}
複数のキーと値のペアを更新する場合にも同じ概念が適用されます。指定する必要があるのはそれらのペアだけです。
SELECT json_patch('{
"name" : "Fluffy",
"type" : "Cat",
"age" : 10
}',
'{
"name" : "Baldy",
"age" : 11
}'
);
結果:
{"name":"Baldy","type":"Cat","age":11}
更新と挿入
SELECT json_patch('{ "name" : "Fluffy" }', '{ "name" : "Baldy", "age" : 10 }');
結果:
{"name":"Baldy","age":10}
削除/削除
マージパッチのnull値には、ターゲット内の既存の値が削除されたことを示す特別な意味があります。
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '{ "age" : null }');
結果:
{"name":"Fluffy"}
配列
json_patch()
関数は、配列に要素を追加したり、配列の個々の要素を変更したりすることはできません。アレイ全体を単一のユニットとして挿入、置換、または削除することしかできません。
したがって、配列に要素を追加する例を次に示します。
SELECT json_patch('[ 1, 2, 3 ]', '[ 1, 2, 3, 4 ]');
結果:
[1,2,3,4]
元のアレイをまったく新しいアレイに交換する必要がありました。したがって、技術的には、実際には何も追加しませんでした。アレイ全体を別のアレイに置き換えただけです。
配列がオブジェクト内にある場合も同じ概念が適用されます:
SELECT json_patch('{ "scores" : [ 1, 2, 3 ] }', '{ "scores" : [ 1, 2, 3, 4 ] }');
結果:
{"scores":[1,2,3,4]}
配列を操作する必要がある場合は、json_set()
などの関数を試してください 、json_insert()
、json_remove()
およびjson_replace()
代わりに。
オブジェクトを配列に置き換える
パッチとして配列を指定するだけで、オブジェクトを配列に置き換えることができます。
SELECT json_patch('{ "name" : "Fluffy", "age" : 10 }', '[ "Fluffy", 10 ]');
結果:
["Fluffy",10]
配列をオブジェクトに置き換える
そして、それは逆にも機能します:
SELECT json_patch('[ "Fluffy", 10 ]', '{ "name" : "Fluffy", "age" : 10 }');
結果:
{"name":"Fluffy","age":10}