表の行をJSONのオブジェクト文字列に変換する。
成果物
json_group_object()
key=1, value=1
ターミナルで以下コマンドを実行する。
sqlite3
対話モードにて以下コマンドをコピペし実行。
create table users(id int primary key, key text, value text); insert into users values(111, 'age', '12'); insert into users values(222, 'name', 'yamada'); insert into users values(333, 'class', 'A'); .headers on .mode column select json_group_object(key, value) from users;
実行結果は以下。
json_group_object(key, value) ---------------------------------------- {"age":"12","name":"yamada","class":"A"}
キーが重複してしまう場合
なお、以下のときはキーが重複したJSONが出来てしまう。
key=1, value=多
key=多, value=多
同一キーで値が複数あったら配列にしてくれたらいいのに……。
key=1, value=多
create table users(id int primary key, key text, value text); insert into users values(111, 'age', '12'); insert into users values(222, 'name', 'yamada'); insert into users values(333, 'class', 'A'); .headers on .mode column select json_group_object('value', value) from users;
json_group_object('value', value) ------------------------------------------- {"value":"12","value":"yamada","value":"A"}
value
キーを3つ持ったオブジェクト……。キー重複は不正なのだからせめて{"value": [12, "yamada", "A"]}
になってくれよ……。
key=多, value=多
create table users(id int primary key, key text, value text); insert into users values(111, 'age', '12'); insert into users values(222, 'age', '34'); insert into users values(333, 'name', 'yamada'); .headers on .mode column select json_group_object(key, value) from users;
json_group_object(key, value) --------------------------------------- {"age":"12","age":"34","name":"yamada"}
age
キーを2つ持ったオブジェクト……。キー重複は不正なのだからせめて{"age": [12, 34], "name": "yamada"}
になってくれよ……。
できないこと
できないこと
テーブルをオブジェクトに変換できない
前回の最後でも述べた通り。
create table users(id int primary key, age int, name text); insert into users values(111, '12', 'yamada'); insert into users values(222, '25', 'suzuki'); insert into users values(333, '38', 'tanaka');
期待値は以下。
{"id":111,"age":"12","name":"yamada"} {"id":222,"age":"25","name":"suzuki"} {"id":333,"age":"38","name":"tanaka"}
まずはレコードをキーバリューのリストにした表にしたい。だが、そんなSQL関数はない。
所感
というわけで、json_group_object(key, value)
は、key
とvalue
が1対1になるときしか正常なJSON形式を返してくれない。
要望
できることなら表に行番号があるときは[{...}, {...}, ]
のようなオブジェクト配列になってほしいくらいなのだが。
こんな関数あったらいいな
create table users(id int primary key, name text); insert into users values(111, 'yamada'); insert into users values(222, 'suzuki');
rowid key value 0 id 111 0 name yamada 1 id 222 1 name suzuki
select json_group_object_array(users);
[ {"id":111, "name":"yamada"}, {"id":222, "name":"suzuki"} ]
情報源
対象環境
- 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 行→配列)