使いたい人生だった
Qittaのとある記事みてMySQL5.7から追加されたJSON型で遊んでみたくなった。さっそく手元のDBで試そうと思ったら
You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'JSON
ファーーーーーーーーーーーってそういえば手元のDBMySQLじゃなくてMariaDBだったは(
で終わり、は流石にアレなのでMariaDBのDynamic Columnsで遊んでみた
環境
試す
まずは適当なjson_testテーブルを作成(正確にはJSONではないがJSON型があると思って作ってしまったので
CREATE TABLE `json_test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`json` text,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
1つデータを追加してみる
INSERT INTO json_test VALUES (1, COLUMN_CREATE('name', 'taro', 'color', 'red'));
いけたのでもう1つ適当に
INSERT INTO json_test VALUES (2, COLUMN_CREATE('name', 'hanako', 'color', 'black'));
見てみよう
mysql> SELECT * from json_test
+----+-------------------------------------+
| id | json |
+----+-------------------------------------+
| 1 | S namecolor!taro!red |
| 2 | s namecolor!hanako!black |
+----+-------------------------------------+
お、おう?
中身も表示させたい場合は COLUMN_JSON
を使うといい感じ。JSONで取れるの便利
mysql> select id, COLUMN_JSON(json) from json_test;
+----+-----------------------------------+
| id | COLUMN_JSON(json) |
+----+-----------------------------------+
| 1 | {"name":"taro","color":"red"} |
| 2 | {"name":"hanako","color":"black"} |
+----+-----------------------------------+
JSONの特定の要素のみ取得したい場合はCOLUMN_GET
mysql> select id, COLUMN_GET(json, 'name' AS char) AS name from json_test;
+----+--------+
| id | name |
+----+--------+
| 1 | taro |
| 2 | hanako |
+----+--------+
JSONに対してWHEREもかけることができる
SELECT id, COLUMN_JSON(json) FROM json_test WHERE COLUMN_GET(json, 'name' AS CHAR) = 'taro';
+----+-------------------------------+
| id | COLUMN_JSON(json) |
+----+-------------------------------+
| 1 | {"name":"taro","color":"red"} |
+----+-------------------------------+
今までにないカラムを追加してみる
INSERT INTO json_test VALUES (3, COLUMN_CREATE('name', 'piyo', 'color', 'blue', 'age', 33));
見てみよう
mysql> select id, COLUMN_JSON(json) from json_test;
+----+-----------------------------------------+
| id | COLUMN_JSON(json) |
+----+-----------------------------------------+
| 1 | {"name":"taro","color":"red"} |
| 2 | {"name":"hanako","color":"black"} |
| 3 | {"age":33,"name":"piyo","color":"blue"} |
+----+-----------------------------------------+
値のないものはNULLになる
mysql> select id, COLUMN_GET(json, 'age' AS integer) AS name from json_test;
+----+------+
| id | name |
+----+------+
| 1 | NULL |
| 2 | NULL |
| 3 | 33 |
+----+------+