LoginSignup
5
2

More than 5 years have passed since last update.

【mysql5.6】JSON型でデータを取得する

Last updated at Posted at 2018-10-18

mysql5.7から、jsonがサポートされました。
https://dev.mysql.com/doc/refman/5.7/en/json.html

しかし、mysql5.7以前のバージョンを使っているサービスは多く存在しているでしょう。
そこで、mysql5.7以前のバージョンでも、DBからJSON型でデータを取得する方法を記しておきます。

下記、サンプルになります。

サンプルテーブル

userテーブル

user_id user_name user_passwd user_passwd_h1 user_passwd_h2 create_datetime
1 yamako jdti8eF3 QP3J-Dhp ZVSEg9Qe 2018/10/18 9:21:57.981
2 mikiko 6UU2hVxm (NULL) (NULL) 2018/10/18 12:05:18.452
3 yoshiko mhKxekBR FecFwETb (NULL) 2018/10/18 18:58:31.216
4 nishiko TJWeYTQb 2SapnkBt TgdBKSLi 2018/10/17 15:43:12.754

ソース

CREATE TABLE `user` (
  `user_id` int NOT NULL AUTO_INCREMENT COMMENT 'ユーザーID',
  `user_name` varchar(20) COLLATE utf8_bin NOT NULL COMMENT 'ユーザ名',
  `user_passwd` varchar(64) COLLATE utf8_bin NOT NULL COMMENT 'パスワード',
  `user_passwd_h1` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'パスワード1世代前',
  `user_passwd_h2` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT 'パスワード2世代前',
  `create_datetime` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '作成日時',
  PRIMARY KEY (`user_id`)
);

クエリでJSON型データを取得する

DBにクエリ発行し、JSON型でデータを取得する。
JSON型データというのは、key:value形式のデータを指しており、keyがカラム、valueがデータとなる。
なお、下記の項目を考慮する。
・データが文字列の場合、ダブルクォート"で囲う。
・データが数字、nullの場合、ダブルクォート"を付けない。
・カラムcreate_dataは、UNIXミリ秒で表示する。
・条件WHEREで指定した年月日を検索対象とする。

クエリ

SELECT
  CONCAT('{"accOffDateTime":', user_id, '.', ''), ','),
  CONCAT('"userName":', user_name, ','),
  CONCAT('"userPasswd":', user_passwd, '",'),
  case when user_passwd_h1 is null then '"userPasswdH1":null,' else CONCAT('"userPasswdH1":"', user_passwd_h1, '",') end,
  case when user_passwd_h2 is null then '"userPasswdH2":null,' else CONCAT('"userPasswdH2":"', user_passwd_h2, '",') end,
  CONCAT('"createDatetime":"', REPLACE(unix_timestamp(acc_on_datetime), '.', ''), '"}')
FROM
  user 
WHERE
  DATE_FORMAT(create_datetime, '%Y%m%d') = '20181018';

クエリ結果

{"userId":1, "userName":"yamako", "userPasswd":"jdti8eF3", "userPasswdH1":"QP3J-Dhp ", "userPasswdH2":"ZVSEg9Qe", "createDatetime":1539854517981}
{"userId":2, "userName":"mikiko", "userPasswd":"6UU2hVxm", "userPasswdH1":null, "userPasswdH2":null, "createDatetime":1539864318452}
{"userId":3, "userName":"yoshiko", "userPasswd":"mhKxekBR", "userPasswdH1":"FecFwETb", "userPasswdH2":null, "createDatetime":1539889111216}

参考ドキュメント

・CONCAT 関数
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html#function_concat

・unix_timestamp 関数
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_unix-timestamp

・CASE 構文
https://dev.mysql.com/doc/refman/5.6/ja/case.html

・REPLACE 構文
https://dev.mysql.com/doc/refman/5.6/ja/replace.html

・DATE_FORMAT 関数
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_date-format

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2