MySQLでは、JSON_EXTRACT()
関数はJSONドキュメントからデータを返します。返される実際のデータは、引数として指定したパスによって決まります。
最初の引数としてJSONドキュメントを指定し、その後に返すデータのパスを指定します。ドキュメント内の複数の場所からデータを返すための複数のパスを提供することもできます。
構文
構文は次のようになります:
JSON_EXTRACT(json_doc, path[, path] ...)
json_doc
の場所 JSONドキュメントとpath
返す値へのパスです。
これらの引数が複数の値を返す可能性がある場合、一致した値は、それらを生成したパスに対応する順序で配列として自動ラップされます。
例1-基本的な使用法
実例を示します。
SELECT JSON_EXTRACT('{"a": 1, "b": 2, "c": 3}', '$.b') AS 'Result';
結果:
+--------+ | Result | +--------+ | 2 | +--------+
この場合、キーb
の値を返しました。 。
別の例を次に示します。
SELECT JSON_EXTRACT('{"Name": "Bart", "Age": 10}', '$.Name') AS 'Result';
結果:
+--------+ | Result | +--------+ | "Bart" | +--------+
例2–存在しないパス
存在しないパスを指定すると、NULL値が返されます。
SELECT JSON_EXTRACT('{"Name": "Homer", "Age": 39}', '$.Gender') AS 'Result';
結果:
+--------+ | Result | +--------+ | NULL | +--------+
引数のいずれかがNULL
の場合も、NULL値を取得します 。
例3–アレイ
配列を使用した例を次に示します。
SELECT JSON_EXTRACT('[1, 2, 3]', '$[2]') AS 'Result';
結果:
+--------+ | Result | +--------+ | 3 | +--------+
配列はゼロベースの番号付けを使用するため、この場合、3番目の要素が置き換えられます。
別の配列の例を次に示します。今回は、ネストされた配列から値を返します。
SELECT JSON_EXTRACT('[1, 2, [3, 4, 5]]', '$[2][1]') AS 'Result';
結果:
+--------+ | Result | +--------+ | 4 | +--------+
例4–複数のパス
JSONドキュメント内の複数の場所からデータを返すために、複数のパスを指定できます。
基本的な例:
SELECT JSON_EXTRACT('[1, 2, 3, 4, 5]', '$[1]', '$[3]') AS 'Result';
結果:
+--------+ | Result | +--------+ | [2, 4] | +--------+
例5–より大きなJSONドキュメント
これは、少し大きいJSONドキュメントの例です。
SET @data = '{ "Person": { "Name": "Homer", "Age": 39, "Hobbies": ["Eating", "Sleeping"] } }'; SELECT JSON_EXTRACT(@data, '$.Person.Name', '$.Person.Age', '$.Person.Hobbies') AS 'Result';
結果:
+---------------------------------------+ | Result | +---------------------------------------+ | ["Homer", 39, ["Eating", "Sleeping"]] | +---------------------------------------+
必要に応じて、配列から特定の要素を選択することもできます。
SET @data = '{ "Person": { "Name": "Homer", "Age": 39, "Hobbies": ["Eating", "Sleeping"] } }'; SELECT JSON_EXTRACT(@data, '$.Person.Name', '$.Person.Age', '$.Person.Hobbies[1]') AS 'Result';
結果:
+---------------------------+ | Result | +---------------------------+ | ["Homer", 39, "Sleeping"] | +---------------------------+