SQLite json_replace()
関数を使用すると、JSONドキュメントの既存の値を別の値に置き換えることができます。
関数を呼び出すときに最初の引数として元のJSONを渡し、その後に置換する値のパス、続いて置換する値を渡します。
必要に応じて、複数のキーと値のペアを置き換えることもできます。
構文
これは次のように機能します:
json_replace(json, path1, value1, path2, value2...)
json
元のJSONを表し、path1, value1, path2, value2...
置き換えるパスと値のペアです。
例
実例となる基本的な例は次のとおりです。
SELECT json_replace('{ "name" : "Fluffy" }', '$.name', "Baldy");
結果:
{"name":"Baldy"}
ここでは、name
の値を更新しました Fluffy
からのキー Baldy
へ 。
次のように、複数のキーと値のペアを更新できます。
SELECT json_replace('{
"name" : "Fluffy",
"age" : 10
}',
'$.name', "Baldy",
'$.age', 11
);
結果:
{"name":"Baldy","age":11}
json_replace()
を呼び出したときに、キー/値の引数を追加しただけです。 。
ここでは、コードを読みやすくするために改行を使用しました。すべてが1行になっている可能性があり、結果は同じでした。
キーが存在しない場合はどうなりますか?
キーがJSONにまだ存在しない場合、何も置き換えられません:
SELECT json_replace('{ "name" : "Fluffy" }', '$.age', 11);
結果:
{"name":"Fluffy"}
これは、json_replace()
を区別する主な特徴です json_set()
からの関数 およびjson_insert()
関数。キーがまだ存在しない場合、これらの関数は値を挿入します。
ただし、json_replace()
を使用して新しいキーを効果的に挿入することは可能です。 JSONオブジェクト/ドキュメント全体を置き換えることによって。以下の例。
JSONドキュメント全体を置き換える
json_replace()
を使用できます JSONドキュメント全体を別のドキュメントに置き換えるには:
SELECT json_replace('{ "name" : "Fluffy" }', '$', json('{ "name" : "Baldy" }') );
結果:
{"name":"Baldy"}
したがって、これにより、ドキュメントに新しいキーを効果的に挿入できます。
SELECT json_replace('{
"name" : "Fluffy"
}',
'$',
json('{
"name" : "Baldy" ,
"age" : 11
}'
)
);
結果:
{"name":"Baldy","age":11}
厳密に言えば、新しいキーは挿入しませんでした。ドキュメント全体を置き換えただけです。しかし、その結果、元のキーには含まれていなかったキーを含むJSONドキュメントが作成されました。
埋め込みオブジェクトを置き換える
埋め込まれたオブジェクトを置き換えることもできます:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json('{ "c" : 2 }')
);
結果:
{"a":1,"b":{"c":2}}
これを行うときは、json()
を使用しました 引数をJSON文字列として返す関数。そうしないとどうなりますか:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
'{ "c" : 2 }'
);
結果:
{"a":1,"b":"{ \"c\" : 2 }"}
JSONドキュメントはJSONオブジェクトではなくテキスト値として挿入されるため、二重引用符は円記号でエスケープされます。
ただし、エラーが発生するため、一重引用符を単純に削除することはできません。
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
{ "c" : 2 }
);
結果:
Parse error: unrecognized token: "{" "b" : { "c" : 1 } }', '$.b', { "c" : 2 } ); error here ---^
一重引用符またはjson()
なし 関数の場合、左中括弧に遭遇するとすぐにエラーが発生します。したがって、一重引用符またはjson()
を使用する必要があります JSONオブジェクトを挿入するか、SQL文字列/テキスト値を挿入するかによって異なります。
JSONオブジェクトを挿入する別の方法は、json_object()
を使用することです。 json()
の代わりに関数 機能:
SELECT json_replace('
{
"a" : 1,
"b" : { "c" : 1 }
}',
'$.b',
json_object('c', 2)
);
結果:
{"a":1,"b":{"c":2}}
アレイを交換する
同じ概念がアレイにも当てはまります:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json('[ 5, 6, 7 ]'));
結果:
{"a":[5,6,7]}
json()
を削除すると 関数、これを取得します:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', '[ 5, 6, 7 ]');
結果:
{"a":"[ 5, 6, 7 ]"}
また、一重引用符を削除すると、エラーが発生します:
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]);
結果:
Parse error: no such column: 5, 6, 7 (17) LECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', [ 5, 6, 7 ]); error here ---^
または、json_array()
を使用することもできます json()
の代わりに関数 。この関数を使用すると、引数に基づいて配列を作成できます。
SELECT json_replace('{ "a" : [ 1, 2, 3 ] }', '$.a', json_array(5, 6, 7));
結果:
{"a":[5,6,7]}
配列の最後に値を追加する
配列の最後に値を追加するには、json_insert()
のいずれかを使用できます またはjson_set()
関数。
ただし、json_replace()
を使用する必要がある場合 、配列全体を、配列の最後に追加の値が追加された別の配列に置き換えることができます:
SELECT json_replace('[ 1, 2, 3 ]', '$', json('[ 1, 2, 3, 4 ]') );
結果:
[1,2,3,4]
ただし、前述のように、json_insert()
およびjson_set()
配列全体を置き換えることなく、実際に配列に値を追加できます。
配列要素を置き換える
json_replace()
の使用例を次に示します。 配列内の要素を置き換えるには:
SELECT json_replace('[ 1, 2, 3 ]', '$[1]', 4 );
結果:
[1,4,3]
配列はゼロベースであるため、[1]
2番目の配列項目を示します。
json_set()
関数を使用して、既存の要素を置き換えることもできます。ただし、json_insert()
関数では、既存の要素を置き換えることはできません。
無効なパス
パスが整形式でない場合はエラーが発生します:
SELECT json_replace('{ "a" : 1 }', 'a', 2);
結果:
Runtime error: JSON path error near 'a'
この場合、$.
パスの前にあります。
無効なJSONドキュメント
また、JSONの形式が正しくないというエラーも表示されます:
SELECT json_replace('{ "a" : 1', '$.a', 2);
結果:
Runtime error: malformed JSON
今回のエラーは、JSONの形式が正しくないことを示しています。