【ITニュース解説】第243回 MySQLのJSON_TABLE()を使ってJSONデータを行に分解する
2025年04月15日に「Gihyo.jp」が公開したITニュース「第243回 MySQLのJSON_TABLE()を使ってJSONデータを行に分解する」について初心者にもわかりやすいように丁寧に解説しています。
ITニュース概要
MySQLの`JSON_TABLE()`は、JSON形式のデータを通常の表(テーブル)のように扱える関数だ。複雑なJSON配列を個別の「行」として分解し、効率的に操作できるようになる。システム開発でJSONデータを活用する際に役立つ。
ITニュース解説
近年、Webアプリケーションやサービスで扱われるデータ形式として、JSON(JavaScript Object Notation)が広く利用されている。JSONは、データを人間が読み書きしやすく、機械が解析しやすいテキスト形式で表現する。例えば、ある商品の情報であれば、商品名、価格、説明、そして複数のレビューといった情報を、階層的な構造を持つ一つのJSONデータとして表現できる。これは特にWeb API(アプリケーションが互いに情報をやり取りするための仕組み)において、柔軟なデータ交換を可能にするため非常に便利である。
一方で、多くのシステムでデータの保存や管理に使われているのは、リレーショナルデータベースと呼ばれる形式である。リレーショナルデータベースでは、データをテーブルという表形式で扱う。テーブルは行と列で構成され、各行は一つのデータのレコードを、各列はそのデータの特定の属性(例えば、商品のテーブルであれば「商品名」や「価格」といった列)を表す。このような厳密な構造を持つことで、データの整合性を保ちやすく、効率的な検索や集計処理が可能になる。
JSONデータは柔軟性が高い反面、そのままの形でリレーショナルデータベースに取り込んで詳細な分析や検索を行おうとすると、課題が生じる場合がある。例えば、一つのJSONデータの中に複数のレビューが含まれている場合、それぞれのレビューに対して条件をつけたり、個別に集計したりすることは、通常のSQL(リレーショナルデータベースを操作するための言語)では難しい。JSONデータをリレーショナルな形に変換できれば、データベースの強力な機能を活用して、より高度なデータ分析やレポート作成が可能になる。
このような課題を解決するため、MySQLにはJSON_TABLE()という便利な関数が用意されている。JSON_TABLE()は、JSONドキュメント(JSONデータ全体)をあたかもリレーショナルデータベースのテーブルであるかのように、仮想的なテーブルとして扱えるようにする機能を提供する。これにより、JSONデータの特定の要素を行として分解し、必要な情報を列として抽出できる。
JSON_TABLE()の基本的な使い方を見てみよう。この関数は、主に二つの重要な引数と一つの句で構成される。まず一つ目は、変換したいJSONドキュメント自体を指定する。次に、pathと呼ばれる引数で、JSONドキュメントのどの部分を分解して行にしたいかを指定する。例えば、JSONデータの中に複数の要素を持つ配列が含まれている場合、その配列の各要素を新しい行として取り出したいときに、その配列へのパスを指定する。このpathは、JSONPathと呼ばれる表記方法で記述される。
そして最も重要な部分がCOLUMNS句である。この句の中で、仮想テーブルの列の名前、その列に格納するデータの型、そして元のJSONドキュメントのどのパスからその値を取得するかを定義する。例えば、「商品名」という列には、JSONドキュメント内の$.nameというパスにある文字列データを格納し、「価格」という列には、$.priceというパスにある整数データを格納するといった指定をする。これにより、元のJSONデータが持つ階層的な構造から、分析に適したフラットなテーブル構造を作り出すことができる。
COLUMNS句の中では、さらに高度な指定も可能である。例えば、FOR ORDINALITYというキーワードを使うと、JSON配列の各要素が元々持っていた順番(インデックス)を、新しい仮想テーブルの列として採番して取得できる。これは、配列の要素の順序が意味を持つ場合に非常に役立つ。また、JSONデータが入れ子構造になっている場合、つまりJSONデータの中にさらにJSONデータが含まれている場合でも、NESTED PATHという句をCOLUMNS句内で利用することで、入れ子になったJSONデータをさらに分解し、複数の階層のデータを一つのテーブルにまとめるといった複雑な抽出も可能である。
JSON_TABLE()を活用することで、様々なメリットが生まれる。まず、JSON配列の各要素を個別の行として扱うことができるため、それらの要素に対して直接SQLのWHERE句(条件指定)、JOIN句(他のテーブルとの結合)、GROUP BY句(集計)といった強力な機能を利用できる。これにより、特定の条件に合致するレビューだけを抽出したり、商品ごとのレビュー数を集計したり、さらには既存のリレーショナルテーブルに格納されている商品情報と、JSONから抽出したレビュー情報を結合して、より詳細な分析を行ったりすることも容易になる。
つまり、JSON_TABLE()は、柔軟な形式を持つJSONデータを、リレーショナルデータベースが最も得意とするテーブル形式に変換する「橋渡し役」となる。これにより、システムエンジニアはJSONデータの持つ情報に、リレーショナルデータベースの持つ検索・分析能力を存分に適用できるようになる。結果として、JSON形式で提供される豊富なデータを、既存のデータベースシステムと連携させてより深く洞察し、ビジネス価値を最大化するための強力なツールとして活用できるのである。