SQLite3学習 JSON拡張(json_set)
指定したJSONの指定したJSONパスへ、指定した値を代入する。
成果物
json_set()
ターミナルで以下コマンドを実行する。
sqlite3
対話モードにて以下コマンドをコピペし実行。
object
select json_set('{"a":1}', '$.a', 2);
{"a":2}
- キーは第二引数の末尾で指定せねばならない
- バリューは第三引数で指定せねばならない
指定したキーが存在しないときは追加する。json_set()
=json_insert()
+json_replace()
。
select json_set('{}', '$.a', 1);
{"a":1}
select json_set('{"a":1}', '$.b', 2);
{"a":1,"b":2}
array
select json_set('[1]', '$[0]', 2);
[2]
select json_set('[1,2]', '$[0]', 10);
[10,2]
select json_set('[1,2]', '$[1]', 20);
[1,20]
末尾インデックスが存在しないときは追加する。json_set()
=json_insert()
+json_replace()
。
select json_set('[]', '$[0]', 1);
[1]
select json_set('[1,2]', '$[2]', 30);
[1,2,30]
範囲外インデックスを指定しても変化なし。
select json_set('[]', '$[1]', 1);
[]
インデックスに負数は設定できない。
select json_set('[]', '$[-1]', 1);
Error: JSON path error near '[-1]'
キーの値がオブジェクトのとき
select json_set('{"a":{"name":"yamada"}}', '$.a', 1);
{"a":1}
まちがってオブジェクト構造を破壊してしまいそう……。
キーの値が配列のとき
select json_set('{"a":[1,2]}', '$.a', 1);
{"a":1}
まちがって配列構造を破壊してしまいそう……。
配列の値がオブジェクトのとき
select json_set('[1]', '$[0]', json('{"a":1}')); select json_set('[1]', '$[0]', json_object('a', 1));
[{"a":1}] [{"a":1}]
配列の値が配列のとき
select json_set('[1]', '$[0]', json('[10]')); select json_set('[1]', '$[0]', json_array(10));
[[10]] [[10]]
null
をセットしても削除しない
値null
がセットされる。
array
select json_set('[1]', '$', null); select json_set('[1]', '$[0]', null);
[null]
object
select json_set('{"a": 1}', '$', null); select json_set('{"a": 1}', '$.a', null); select json_set('{"a": {"b": 1}}', '$.a.b', null);
{"a":null} {"a":{"b":null}}
所感
json_set()
はSQLでいうUPSERT
だろう。追加と更新をするときの関数だ。削除はできない。変更箇所が1点のときjson_patch()
よりネスト指定が楽な分だけ有用だろう。
情報源
対象環境
- Raspbierry pi 3 Model B+
- Raspbian stretch 9.0 2018-11-13
- bash 4.4.12(1)-release
- SQLite 3.29.0
$ uname -a Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux
前回まで
- SQLite3学習をはじめよう
- SQLite3学習 SQLiteについて
- SQLite3学習 SQLiteの適切な用途
- SQLite3学習 SQLiteの特徴
- SQLite3学習 SQLiteのクセ
- SQLite3学習 データ型とアフィニティ
- SQLite3学習 演算子の一覧
- SQLite3学習 よくある質問
- SQLite3学習 SQLiteダウンロード&コンパイル
- SQLite3学習 Tclで操作する
- SQLite3学習 ビルドオプション動作確認(SQLITE_ALLOW_URI_AUTHORITY)
- SQLite3学習 面白そうなコンパイルオプション
- SQLite3学習 SQLiteの拡張について
- SQLite3学習 JSON拡張
- SQLite3学習 JSON拡張(json_extract)
- SQLite3学習 JSON拡張(json_each)
- SQLite3学習 JSON拡張(json_tree オブジェクト→行)
- SQLite3学習 JSON拡張(json_tree オブジェクトツリー→行)
- SQLite3学習 JSON拡張(json_tree オブジェクト配列→行)
- SQLite3学習 JSON拡張(json_group_array 行→配列)
- SQLite3学習 JSON拡張(json_group_object 行→オブジェクト)
- SQLite3学習 JSON拡張(json_array_length)
- SQLite3学習 JSON拡張(json_type)
- SQLite3学習 JSON拡張(json_valid)
- SQLite3学習 JSON拡張(json_quote)
- SQLite3学習 JSON拡張(json_array)
- SQLite3学習 JSON拡張(json_object)
- SQLite3学習 JSON拡張(json_patch)
- SQLite3学習 JSON拡張(json_insert)
- SQLite3学習 JSON拡張(json_replace)