やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

SQLite3学習 JSON拡張(json_group_object 行→オブジェクト)

 表の行を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)は、keyvalueが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"}
]

情報源

対象環境

$ uname -a
Linux raspberrypi 4.19.42-v7+ #1218 SMP Tue May 14 00:48:17 BST 2019 armv7l GNU/Linux

前回まで