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