JSON_TABLE()は、JSON内の配列部分を引数に与えて、その配列内の要素をテーブル形式にして返してくれる関数です*1。「1個のJSONデータ」から複数の行が生成されます。以下は、JSON_TABLE()関数の第一引数に生のJSON配列をそのまま与えてみた例です。|+---------------+----------------+JSON_TABLE()は、このように、第1引数にJSON配列を、第2引数にはどのJSONパスの内容を何という名前のカラムとして生成するのかを定義する情報を与える使い方ができます。値を与えるのじゃ使いにくい関数の引数にJSONの値をそのまま記述するのは使いにくいので、一歩進めて変数を使うことにした方法です。JSON_TABLE()関数を使用する部分は、少しスッキリしました。テーブルのデータから配列部分を取ってきて、第1引数に与えることを試みます。配列部分はj->"$.daily_summaries"で示されるパスにあるので、これを使ってみたのが以下の例。JSON_TABLEあらら。記述法を変えるなどして試したのですが、どうやら第1引数にはサブクエリは(まだ?)採れないようです。テーブル上のJSONデータを使用する(トライ2:一応成功、ただし格好悪い)そこで、先ほど試した「一旦変数に入れる」ワザを使います。sec)一応成功しました。テーブル上のJSONデータを使用する(トライ3:一応成功、ただし納得してない)先ほどの例では、やりたいことは実現できましたが、一旦変数に入れるあたりがRDBMSっぽくなくて格好悪いです。べつにカッコつける必要もないのだけど。ネットを見ていると、JSONデータを格納しているテーブルそのものと、JSON_TABLE()によって作られたテーブルとをJOINすれば良いらいしいということでやってみたら、それっぽい結果に。sec)ただし、これ、結合条件を書いていないところが気持ち悪くて、たぶん今回レコードが1件しかないおかげでまともに動作しているように見えるだけなのかも、、、という気もしています。必要なときにもう少しツッコんで調べることにします。最終目的地へもともとは、「COCOAアプリが吐き出したJSONデータを、MySQLを使って見てみたい」ということで、今回の「お勉強」が始まったのでした。いうことで、最終目的地のひとつに到着します。先ほど得たデータは、日ごとの陽性者との接触時間を表したデータでした。ミリ秒なので、演算を加えて日付にしてみました。たくさんの時間、陽性の方と過ごしたようです。割ると、接触していた分数(の合計)になるようです。(ちなみに、幸いにもこの接触による私への感染は、なかったようです(あれから2週間以上経過))おわりにこんな感じで、JSON_TABLE()を使うと、ひとつのJSONデータから、テーブルの形式に変換して値を抽出することができるようになることがわかりました。今回は1件のデータだけを持つテーブルを元にして試したので、今後、複数レコードあるケースなど、もうすこし試してみるべきかもしれません。(個人的にはここで、取得に関しては一旦おしまいにします)せっかく触り始めたので、生成系の関数も試してみたくなってきました。そのうち試してみたいと思います。*1:実際はもうちょっといろいろなものを与えられます。8.0.30/MySQL5.7.39リリース。はてなブログPro気楽気ままに、主に技術に関することお仕事に関係することおよびそれらの周辺領域について書いていきます。各記事につけられた日付は便宜上のものであり、必ずしも記事公開の日付をあらわしたものではありません。サイトは、Amazon.co.jpを宣伝しリンクすることによってサイトが紹介料を獲得できる手段を提供することを目的に設定されたアフィリエイトプログラムである、Amazonアソシエイト・プログラムの参加者です。はてなブログをはじめよう!sakaikさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。