MySQL(5.7 以降)で「JSON 型」のカラムから指定したキーを取得する場合 JSON_EXTRACT()
を使う.もしくは JSON_EXTRACT()
と同じ動作をする ->
オペレータを使うこともできる.以下に members
テーブルの info
カラムから name
キーを取得する SQL を載せる.なお,今回は MySQL 8.0.19 を検証環境にした.
-- サンプルテーブルを作成する mysql> CREATE TABLE members ( info json DEFAULT NULL ); Query OK, 0 rows affected (0.10 sec) -- サンプルデータを追加する mysql> INSERT INTO members VALUES ('{"id": 1, "name": "kakakakakku"}'); Query OK, 1 row affected (0.10 sec) -- サンプルデータを確認する mysql> SELECT * FROM members; +----------------------------------+ | info | +----------------------------------+ | {"id": 1, "name": "kakakakakku"} | +----------------------------------+ 1 row in set (0.01 sec) -- JSON_EXTRACT() を使って取得する mysql> SELECT JSON_EXTRACT(info, '$.name') FROM members; +------------------------------+ | JSON_EXTRACT(info, '$.name') | +------------------------------+ | "kakakakakku" | +------------------------------+ 1 row in set (0.01 sec) -- -> を使って取得する mysql> SELECT info->'$.name' FROM members; +----------------+ | info->'$.name' | +----------------+ | "kakakakakku" | +----------------+ 1 row in set (0.01 sec)
JSON_UNQUOTE()
と組み合わせる
実際に JSON_EXTRACT()
を使って文字列を取得すると "kakakakakku"
のように「ダブルクオート付き」になる.例えば CHAR
や VARCHAR
と比較するときに困るため,JSON_UNQUOTE()
と組み合わせるとクオートを除去できる.
-- JSON_UNQUOTE(JSON_EXTRACT()) を使って取得する mysql> SELECT JSON_UNQUOTE(JSON_EXTRACT(info, '$.name')) FROM members; +--------------------------------------------+ | JSON_UNQUOTE(JSON_EXTRACT(info, '$.name')) | +--------------------------------------------+ | kakakakakku | +--------------------------------------------+ 1 row in set (0.01 sec)
->>
オペレータを使う
JSON_UNQUOTE(JSON_EXTRACT())
を使うと JSON_UNQUOTE(JSON_EXTRACT(info, '$.name'))
のように長くなってしまう.箇所が多いと SQL の可読性に影響する可能性もある.そこで JSON_UNQUOTE(JSON_EXTRACT())
と同じ動作をする ->>
オペレータを使うこともできる.MySQL 5.7.13 で導入された ->>
オペレータの存在は今まで気付いていなかった!
-- ->> を使って取得する mysql> SELECT info->>'$.name' FROM members; +-----------------+ | info->>'$.name' | +-----------------+ | kakakakakku | +-----------------+ 1 row in set (0.01 sec)
ドキュメントを読むと ->>
は equivalent to JSON_UNQUOTE(JSON_EXTRACT()) と書いてある.
名前 | 説明 |
---|---|
-> | Return value from JSON column after evaluating path; equivalent to JSON_EXTRACT(). |
->> | Return value from JSON column after evaluating path and unquoting the result; equivalent to JSON_UNQUOTE(JSON_EXTRACT()). |
まとめ
- MySQL で「JSON 型」のカラムから指定したキーを取得する場合は
JSON_EXTRACT()
とJSON_UNQUOTE()
を組み合わせる JSON_UNQUOTE(JSON_EXTRACT())
と同じ動作をする->>
オペレータを使うと短く書ける
関連記事
4年前に JSON_EXTRACT()
など JSON を操作する関数を調査した記事も参考になった.とは言え,MySQL 5.7 も MySQL 8.0 も JSON を操作する関数が増えているため,もう1度調査をしておくと良さそう.