2023年7月29日土曜日

SQLite3 2つのJSONをマージする(json_patch())

概要

json_patch()を使用すると 2つのJSONオブジェクトをマージ(統合)することが出来る。

構文


json_patch(JSON_OBJECT1, JSON_OBJECT2)
                
JSON_OBJECT1
元のJSONオブジェクト
JSON_OBJECT2
JSON_OBJECT1に統合するJSONオブジェクト

実行例

環境
  • Windows 10 64bit
  • SQLite3 (3.41.2) Command-Line Shell
基本的な使い方

sqlite> .nullvalue [null]

sqlite> -- # 1.
sqlite> select json_patch('{"a":100, "b":200, "c":300}', '{"c":303, "d":400}');
{"a":100,"b":200,"c":303,"d":400}
sqlite> select json_patch('{"a":100, "b":200, "c":300}', '{"d":400, "e":500}');
{"a":100,"b":200,"c":300,"d":400,"e":500}
sqlite> select json_patch('{"a":100, "b":200, "c":300}', '{"d":400}');
{"a":100,"b":200,"c":300,"d":400}

sqlite> -- # 2.
sqlite> select json_patch('{"a":100, "b":200, "c":300}', '{"b":null}');
{"a":100,"c":300}
sqlite> select json_patch('{"a":100, "b":200, "c":300}', null);
[null]

sqlite> -- # 3.
sqlite> select json_patch(
   ...>         '{
   ...>             "a":{
   ...>                 "b":200,
   ...>                 "c":300
   ...>             }
   ...>         }',
   ...>         '{
   ...>             "a":{
   ...>                 "b":202,
   ...>                 "c":null,
   ...>                 "d":400
   ...>             }
   ...>         }'
   ...>     );
{"a":{"b":202,"d":400}}

                    
  1. 連想配列のキーを基準に1つ目のJSONに対しの2つ目のJSONをマージする
  2. nullを指定するとキーに一致する要素は削除される
  3. 階層構造も統合される
第1引数と第2引数が連想配列でない場合 マージされない

sqlite> -- # 1.
sqlite> select json_patch(1, '{"a":100, "b":200}');
{"a":100,"b":200}
sqlite> select json_patch(true, '{"a":100, "b":200}');
{"a":100,"b":200}
sqlite> select json_patch('[0, 1, 2, 3]', '{"a":100, "b":200}');
{"a":100,"b":200}

sqlite> -- # 2.
sqlite> select json_patch('{"a":100, "b":200}', '[0,1]');
[0,1]
sqlite> select json_patch('{"a":100, "b":200}', 1);
1
sqlite> select json_patch('{"a":100, "b":200}', true);
1
sqlite> select json_patch('[0,1,2,3]', '[4,5]');
[4,5]

sqlite> -- # 3.
sqlite> select json_patch('test', 'test');
Runtime error: malformed JSON
                    
  1. 第1引数が連想配列でない場合、第2引数で全て置換される
  2. 第2引数が連想配列でない場合、第2引数で全て置換される
  3. 第1引数がJSONに変換出来ない場合、エラーとなる

参考URL