ラベル json の投稿を表示しています。 すべての投稿を表示
ラベル json の投稿を表示しています。 すべての投稿を表示

2023年9月9日土曜日

SQLite3 行(ROW)を繋げてJSON配列を作成する (json_group_array())

概要

SQL結果の行(row)を繋げてJSONを作成するには json_group_arrayを使用する。

SQL結果の列(column)を繋げてJSONを作成するには json_arrayjson_objectを使用する。

構文


json_group_array(column_name)
                

環境

  • Windows 10 64bit
  • SQLite3 (3.41.2) Command-Line Shell

実行例

sample
name quantity
tomato 100
potato 120
pumpkin 50

sqlite> .mode box
sqlite> select json_group_array(name) from test;
┌───────────────────────────────┐
│    json_group_array(name)     │
├───────────────────────────────┤
│ ["tomato","potato","pumpkin"] │
└───────────────────────────────┘
sqlite> select json_group_array(quantity) from test;
┌────────────────────────────┐
│ json_group_array(quantity) │
├────────────────────────────┤
│ [100,120,50]               │
└────────────────────────────┘
                

参考URL

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

2023年7月23日日曜日

SQLite3 JSONの要素を削除する(json_remove())

概要

SQLiteでJSONオブジェクトの要素を削除するには json_removeを使用する。

構文


json_remove(JSON_OBJECT, JSON_PATH, JSON_PATH ...)
                
JSON_OBJECT
対象のJSON文字列、もしくはJSONオブジェクト
JSON_PATH
削除する要素のJSON Path。複数指定可能。

実行例

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

sqlite> .log stderr
sqlite> .nullvalue [null]

sqlite> -- # 1.
sqlite> select json_remove('[0,1,2,3,4]', '$[0]');
[1,2,3,4]
sqlite> select json_remove('[0,1,2,3,4]', '$[#-1]');
[0,1,2,3]
sqlite> select json_remove('{"a":10, "b":20}', '$.a');
{"b":20}

sqlite> -- # 2.
sqlite> select json_remove('{"a":10, "b":[0, 1, 2]}', '$.b');
{"a":10}

sqlite> -- # 3.
sqlite> select json_remove('[0,1,2,3,4]', '$');
[null]

sqlite> -- # 4.
sqlite> select json_remove('[1]', '$[0]');
[]
sqlite> select json_remove('{"a":10}', '$.a');
{}

sqlite> -- # 5.
sqlite> select json_remove('[0,1,2,3,4]', '$[10]');
[0,1,2,3,4]
sqlite> select json_remove('[0,1,2,3,4]', '$[#]');
[0,1,2,3,4]
sqlite> select json_remove('{"a":10, "b":20}', '$.z');
{"a":10,"b":20}
                    
  1. JSON Pathで位置を指定して要素を削除する
  2. 指定したJSON Path以下のパスの要素も削除される
  3. ルート要素を削除するとNULLが返る
  4. 配列やオブジェクト内の要素を全部削除すると、空の配列やオブジェクトが残る
  5. 存在しないJSON Pathを指定しても何も起こらずエラーも出力されない
引数に複数のJSON Pathを指定した場合

json_remove()の第2引数以降にJSON Pathを複数指定できる。 ただし、第2引数で指定された要素を削除された後のJSONデータに対し、 第3引数で指定されたJSON Pathが評価される、という順番のようなので 特に配列内の要素を順番を指定して削除する場合には注意すること。


sqlite> -- # 1.
sqlite> select json_remove('{"a":10, "b":20, "c":30, "d":40}', '$.a', '$.c');
{"b":20,"d":40}
sqlite> select json_remove('{"a":10, "b":20, "c":30, "d":40}', '$.a', '$.c', '$.d');
{"b":20}

sqlite> -- # 2.
sqlite> select json_remove('[0,1,2,3,4]', '$[0]', '$[2]');
[1,2,4]
sqlite> select json_remove('[0,1,2,3,4]', '$[0]', '$[1]');
[1,3,4]
sqlite> select json_remove('[0,1,2,3,4]', '$[0]', '$[0]', '$[0]');
[3,4]

sqlite> -- # 3.
sqlite> select json_remove('[0,1,2,3,4]', '$[0]', '$[0]');
[2,3,4]
sqlite> select json_remove(
   ...>             json_remove('[0,1,2,3,4]', '$[0]')
   ...>             , '$[0]'
   ...>         );
[2,3,4]
                    
  1. 複数のJSON Pathを指定して要素を削除出来る
  2. 配列の順番を指定する場合は順番に注意する必要がある
  3. この二つのSQLは同じ結果を返す
第1引数にJSONオブジェクト以外を指定した場合

テキスト型を指定した場合のみエラーになる模様。 他の型は「$」をJSON Pathに指定すれば削除される。


sqlite> .nullvalue [null]

sqlite> -- # 1.
sqlite> select json_remove(1, '$[0]');
1
sqlite> select json_remove('test', '$[0]');
Runtime error: malformed JSON
sqlite> select json_remove(true, '$[0]');
1
sqlite> select json_remove(false, '$[0]');
0

sqlite> -- # 2.
sqlite> select json_remove(1, '$');
[null]
sqlite> select json_remove('test', '$');
Runtime error: malformed JSON
sqlite> select json_remove(true, '$');
[null]
sqlite> select json_remove(false, '$');
[null]
                    
  1. テキストを指定した場合のみJSONエラーになる
  2. 「$」を指定すれば削除されてNULLが返る
引数を一つしか指定しなかった場合

第1引数がJSONとして認識されればエラーにならない


sqlite> .log strerr

sqlite> select json_remove(1);
1
sqlite> select json_remove('[0,1,2,3,4]');
[0,1,2,3,4]
sqlite> select json_remove(true);
1
sqlite> select json_remove(false);
0
sqlite> select json_remove('test');
Runtime error: malformed JSON
sqlite> select json_remove('$');
Runtime error: malformed JSON
                    

参考URL

2023年7月15日土曜日

SQLite3 JSONの要素を置換、もしくは最後に挿入する(json_set())

概要

SQLiteでJSONオブジェクトに要素を置換する方法はいくつかある。 ここではjson_setについて記載する。

構文


json_set(JSON_OBJECT, JSON_PATH, INERT_OBJECT)
                

実行例

環境
  • Windows 10 64bit
  • SQLite3 (3.41.2) Command-Line Shell


.log stderr
sqlite> -- # 1.
sqlite> select json_set('[1,2]', '$[#]', 10);
[1,2,10]
sqlite> select json_set('[1,2]', '$[0]', 10);
[10,2]
sqlite> select json_set('[1,2]', '$[1]', 10);
[1,10]

sqlite> -- # 2.
sqlite> select json_set('[1,2]', '$[5]', 10);
[1,2]

sqlite> -- # 3.
sqlite> select json_set('[1,2]', '$[#]', '{"A":100}');
[1,2,"{\"A\":100}"]
sqlite> select json_set('[1,2]', '$[#]', json('{"A":100}'));
[1,2,{"A":100}]
                
  1. JSON Pathを指定して要素をセットする。 既存の要素を置換するか、要素の最後に追加することができる。
  2. 存在しないJSON Pathを指定した場合、何も起こらない
  3. JSONオブジェクトで置換したい場合はjson()などを使い、 JSONオブジェクトを引数にわたすこと。

参考URL

2023年7月8日土曜日

SQLite3 JSONの要素を置換する(json_replace())

概要

SQLiteでJSONオブジェクトに要素を置換する方法はいくつかある。 ここではjson_replaceについて記載する。

構文


json_replace(JSON_OBJECT, JSON_PATH, INERT_OBJECT)
                

実行例

環境
  • Windows 10 64bit
  • SQLite3 (3.41.2) Command-Line Shell

配列の要素を置換する
指定されたJSON Pathが存在しなかった場合は何もされず、 エラーメッセージも出力されない。


sqlite> .log stderr
sqlite> -- # 1.
sqlite> select json_replace('[1,2]', '$[0]', 10);
[10,2]
sqlite> select json_replace('[1,2]', '$[1]', 10);
[1,10]

sqlite> -- # 2.
sqlite> select json_replace('[1,2]', '$[#]', 10);
[1,2]
sqlite> select json_replace('[1,2]', '$[5]', 10);
[1,2]

sqlite> -- # 3.
sqlite> select json_replace('[1,2]', '$[0]', '{"A":100}');
["{\"A\":100}",2]
sqlite> select json_replace('[1,2]', '$[0]', json('{"A":100}'));
[{"A":100},2]
                
  1. JSON Pathを指定して要素を入れ替える
  2. 存在しないJSON Pathを指定した場合何も起こらない
  3. JSONオブジェクトで置換したい場合はjson()などを使い、 JSONオブジェクトを引数にわたすこと。

参考URL

2023年7月3日月曜日

SQLite3 JSONに要素を追加する(json_insert())

概要

SQLiteでJSONオブジェクトに要素を追加する方法はいくつかある。 ここではjson_insertについて記載する。

構文


json_insert(JSON_OBJECT, JSON_PATH, INERT_OBJECT)
                

実行例

環境
  • Windows 10 64bit
  • SQLite3 (3.41.2) Command-Line Shell

配列の最後に要素を追加する。
配列の最後以外の場所に要素を追加することは出来ず、 追加出来なかった場合、エラーが出力されない。


sqlite> .log stderr
sqlite> -- # 1.
sqlite> select json_insert('[1,2]', '$[#]', 10);
[1,2,10]
sqlite> select json_insert('[1,2]', '$[2]', 10);
[1,2,10]
sqlite> select json_insert('[1,2]', '$[#]', 'text');
[1,2,"text"]

sqlite> -- # 2.
sqlite> select json_insert('[1,2]', '$[0]', 10);
[1,2]
sqlite> select json_insert('[1,2]', '$[1]', 10);
[1,2]

sqlite> -- # 3.
sqlite> select json_insert('[1,2]', '$[5]', 10);
[1,2]

sqlite> -- # 4.
sqlite> select json_insert('[1,2]', '$[#]', '{"A":100}');
[1,2,"{\"A\":100}"]
sqlite> select json_insert('[1,2]', '$[#]', json('{"A":100}'));
[1,2,{"A":100}]

                
  1. 配列の最後に要素を追加する
  2. 特定の位置に挿入したり置換したりすることは出来ない
  3. 存在しないパスを指定しても何も起きない
  4. JSONオブジェクトを挿入したい場合はjson()などを使い、 JSONオブジェクトを引数にわたすこと。

参考URL

2023年4月10日月曜日

SQLite3 JSON配列の要素数を取得する(json_array_length())

概要

json_array_length関数でJSON配列の要素数を取得することが出来る。 なお、取得できるのは配列だけで連想配列の要素数は取得できない。

環境

  • Windows 10 64bit
  • SQLite3 (3.41.2) Command-Line Shell

構文


json_array_length(json_string)
json_array_length(json_string, json_path)
                

実行例


sqlite> -- # 1.
sqlite> select json_array_length('[1,2,3,4]');
4
sqlite> select json_array_length('["a", "b", "c"]');
3

sqlite> -- # 2.
sqlite> select json_array_length('
'  ...>      {
'  ...>         "a": 100
'  ...>          ,"b": 200
'  ...>          ,"c": 300
'  ...>          ,"d": 400
'  ...>      }
'  ...> ');
0

sqlite> -- # 3.
sqlite> select json_array_length('
'  ...>     [
'  ...>         1
'  ...>         , [2,3]
'  ...>         , 4
'  ...>     ]
'  ...> ');
3
                
  1. JSONの配列の要素数を取得する
  2. 連想配列の要素数は取得出来ない
  3. JSON Pathを指定しないと最上位の要素数を返す

sqlite> .nullvalue [null]
sqlite> select json_array_length('[1,2,3,4]', '$');
4
sqlite> select json_array_length('[1,2,3,4]', '$[2]');
0

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

sqlite> -- # 3.
sqlite> select json_array_length('
'  ...>      {
'  ...>          "a": 100
'  ...>          , "b": [ 200, 300 ]
'  ...>          , "c": 400
'  ...>      }
'  ...> ', '$.d');
[null]

sqlite> -- # 4.
sqlite> select json_array_length('
'  ...>      {
'  ...>          "a": 100
'  ...>          , "b": [ 200, 300 ]
'  ...>          , "c": {
'  ...>              "d": 400
'  ...>              , "e": 500
'  ...>          }
'  ...>      }
'  ...> ', '$.c');
0
                
  1. JSON Pathで指定した要素の要素数を取得する
  2. JSON Pathで指定すると連想配列内の配列の要素数を取得出来る
  3. JSON Pathで指定した要素がない場合、NULLが返される
  4. JSON Pathで指定しても連想配列の要素数は取得出来ない

参考URL

2023年3月27日月曜日

SQLite3 JSONから要素を取得する

概要

SQLite3ではJSON Pathを使用してJSONから要素を取得することが出来る。
ただし、ver.3.40.1 の時点で一つのJSONから一つの要素しか取得出来ず、 フィルタ等を使って複数の要素を取得することなどは出来ない。

構文

JSONから要素を取得するには->もしくは->>と JSON Pathを使用する。


'JSON String'->'JSON Path'
'JSON String'->>'JSON Path'
                

実行例

環境
  • Windows 10 64bit
  • SQLite3 (3.40.1) Command-Line Shell

sqlite> select
   ...>     '{
   ...>         "a": [1,2,3] ,
   ...>         "b": {
   ...>             "c": [4,5,6] ,
   ...>             "d": [7,8,9]
   ...>         }
   ...>     }'
   ...>     -> '$.a'
   ...> ;
[1,2,3]
                

sqlite> select
   ...>     '{
   ...>         "a": [1,2,3] ,
   ...>         "b": {
   ...>             "c": [4,5,6] ,
   ...>             "d": [7,8,9]
   ...>         }
   ...>     }'
   ...>     -> '$.b.c[1]'
   ...> ;
5
                

sqlite> select
   ...>     '{
   ...>         "a": [1,2,3] ,
   ...>         "b": {
   ...>             "c": [4,5,6] ,
   ...>             "d": [7,8,9]
   ...>         }
   ...>     }'
   ...>     -> '$.b.c[#-1]'
   ...> ;
6
                

指定されたJSON Pathが存在しなかった場合はNULLになる


sqlite> .nullvalue [null]
sqlite> select
   ...>     '{
   ...>         "a": [1,2,3] ,
   ...>         "b": {
   ...>             "c": [4,5,6] ,
   ...>             "d": [7,8,9]
   ...>         }
   ...>     }'
   ...>     -> '$.x'
   ...> ;
[null]
                

->と->>の違い

->->>の違いは以下の通り。

-> JSON形式で取得する
->> SQL形式で取得する

コマンドラインツールだとわかりにくいが、表示モードをquote に変更するとわかりやすい。


sqlite> .nullvalue [null]
sqlite> .mode quote
sqlite> select '{"a":123}'->'$.a';
'123'
sqlite> select '{"a":123}'->>'$.a';
123
sqlite> select '{"a":"abcdefg"}'->'$.a';
'"abcdefg"'
sqlite> select '{"a":"abcdefg"}'->>'$.a';
'abcdefg'
sqlite> select '{"a":null}'->'$.a';
'null'
sqlite> select '{"a":null}'->>'$.a';
NULL
                

参考URL

2023年3月11日土曜日

SQLite3で使えるJSON Path

概要

JSONからデータを抽出する方法の一つにJSON Pathを利用する方法がある。 XMLにおけるXPathのような間隔で使うことが出来て結構便利。

SQLite3 のver 3.38.0からJSON Pathがサポートされているので、かなり使いやすくなった。

ただし、SQLite3でサポートされているJSON Path は少なく、特にフィルタリングが使えないのは残念。

目次

$

「$」はルート要素を取得する。
「$」だけを指定すればJSONドキュメント全体を取得することになる。

json

{
    "a": [1,2,3] ,
    "b": {
        "c": [4,5,6] ,
        "d": [7,8,9]
    }
}
                        
JSON Path

$
                    
結果

{"a":[1,2,3],"b":{"c":[4,5,6],"d":[7,8,9]}}
                    

.

「.」はキーを指定して子要素を取得する

JSON

{
    "a": [1,2,3] ,
    "b": {
        "c": [4,5,6] ,
        "d": [7,8,9]
    }
}
                    
JSON Path

$.b.c
                    
結果

[4,5,6]
                    

[]

「[]」は位置を数値を指定して配列要素から値を取得する

JSON

{
    "a": [1,2,3] ,
    "b": {
        "c": [4,5,6] ,
        "d": [7,8,9]
    }
}   
                    
JSON Path

$.b.c[0]
                    
結果

4
                    

#

「#」は配列の直後にマイナスを指定して、最終位置から逆準の位置の値を取得する。

JSON

{
    "a": [1,2,3] ,
    "b": {
        "c": [4,5,6] ,
        "d": [7,8,9]
    }
}   
                    
JSON Path

$.b.d[#-1]
                    
結果

9
                    

参考URL

2023年2月8日水曜日

SQLite3 文字列をJSONオブジェクトに変換する(JSON())

概要

文字列をJSONオブジェクトに変換するにはjson関数を使う。
SQLite3ではこの関数で変換したオブジェクトに対し様々な操作を行っていく。

環境

  • Windows 10 64bit
  • SQLite3 (3.40.1) Command-Line Shell

実行例

以下のJSONをSQLite3に認識させる。


[
    {
        "id":1
        , "name":"tomato"
    }
    ,{
        "id":2
        , "name":"potato"
    }
]
                

無事変換出来れば空白や改行が削除された状態で表示される。


sqlite> select json('
   ...>     [
   ...>         {
   ...>             "id":1
   ...>             , "name":"tomato"
   ...>         }
   ...>         ,{
   ...>             "id":2
   ...>             , "name":"potato"
   ...>         }
   ...>     ]
   ...> ');
[{"id":1,"name":"tomato"},{"id":2,"name":"potato"}]
                

正しいJSONフォーマットになっていないとエラーになる

"id":2とすべきところが "id",2となってしまっている例。


[
    {
        "id":1
        , "name":"tomato"
    }
    ,{
        "id",2
        , "name":"potato"
    }
]
                

sqlite> select json('
   ...>     [
   ...>         {
   ...>             "id":1
   ...>             , "name":"tomato"
   ...>         }
   ...>         ,{
   ...>             "id",2
   ...>             , "name":"potato"
   ...>         }
   ...>     ]
   ...> ');
Runtime error: malformed JSON
                

JSONについてきちんと勉強したければRFCを読むといい。

参考URL

2020年11月4日水曜日

SQLite 3 JSON形式でデータを出力する

概要

SQLite3 のコマンドラインツールで select文で取得したデータをJSON形式で出力する。 カラムの型によって出力をダブルクォートで囲んでくれる。 残念ながらJSONファイルをインポートすることはできない。

JSON形式の出力はSQLite のバージョン3.33.0 から利用可能。

JSONのフォーマットについて

JSONの仕様はECMA-404もしくはRFC8259で確認できる。 適当に書いてもアプリが適切に解釈してくれることがあるので 気にしなくてもいいかも知れないが、目を通しておくといい。

環境
  • Windows 10 64bit
  • SQLite3 (3.33.0) Command-Line Shell

実行例

出力モードを変更する「.mode」コマンドを利用する。
ファイルに出力する場合は 「 .once 」コマンドを利用する。

1レコードが カラム名をキーワードとした連想配列となり、 その連想配列を要素とする行列として出力される。

サンプルテーブル(product)
id
primary key
autoincrement
name
not null
quantity
default 0
remark
1 tomato 100
2 potato 120
3 pumpkin 50 (Comment...)
コンソール上に出力する

sqlite> -- # 1.
sqlite> .mode json
sqlite> -- # 2.
sqlite> select * from product;
[{"id":1,"name":"tomato","quantity":100,"remark":""},
{"id":2,"name":"potato","quantity":120,"remark":""},
{"id":3,"name":"pumpkin","quantity":50,"remark":"(Comment...)"}]
                    
  1. JSONモードに切り替え
  2. select文で取得した内容がJSON形式で表示される
ファイルに出力する

sqlite> -- # 1.
sqlite> .mode json
sqlite> -- # 2.
sqlite> .once output.json
sqlite> -- # 3.
sqlite> select * from product;
                    
  1. JSONモードに切り替え
  2. 次のコマンドの結果をoutput.jsonとして出力
  3. select文で取得した内容がJSON形式でファイルに出力される

参考URL