MariaDBでは、JSON_EXTRACT()
は、指定された1つまたは複数のパスに基づいてJSONドキュメントからデータを抽出する組み込み関数です。
単一の値と複数の値を返すことができます。単一の値が一致した場合、単一の値が返されます。複数の値が一致する場合、それらの値は配列で返されます。
構文
構文は次のようになります:
JSON_EXTRACT(json_doc, path[, path] ...)
json_doc
の場所 はJSONドキュメントであり、各path
引数はドキュメント内のパスです。
例
実例を示します。
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name');
結果:
+----------------------------------------+ | JSON_EXTRACT(@json_document, '$.name') | +----------------------------------------+ | "Wag" | +----------------------------------------+
複数のパス
JSONドキュメントから複数の値を返すために複数のパスを指定する例を次に示します。
複数の値を返す場合、それらは配列で返されます。
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');
結果:
+----------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.weight') | +----------------------------------------------------+ | ["Wag", 20] | +----------------------------------------------------+
存在しないパス
JSONドキュメントに存在しないパスを渡すと、NULL
になります 。
例:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.color');
結果:
+-----------------------------------------+ | JSON_EXTRACT(@json_document, '$.color') | +-----------------------------------------+ | NULL | +-----------------------------------------+
ただし、複数のパスが渡され、そのうちの少なくとも1つが一致する場合、一致する値が抽出され、配列で返されます。これは、値が1つだけ抽出された場合でも当てはまります。
例:
SET @json_document = '
{
"name": "Wag",
"type": "Dog",
"weight": 20
}
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');
結果:
+---------------------------------------------------+ | JSON_EXTRACT(@json_document, '$.name', '$.color') | +---------------------------------------------------+ | ["Wag"] | +---------------------------------------------------+
配列
配列からデータを抽出する例を次に示します。
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');
結果:
+---------------------------------------------+ | JSON_EXTRACT(@json_document, '$.awards[0]') | +---------------------------------------------+ | "Top Dog" | +---------------------------------------------+
配列はゼロベースであるため、$.awards[0]
awards
の最初の要素を抽出します 配列。
ネストされたオブジェクト
別のオブジェクト内にネストされたオブジェクトからデータを抽出する例を次に示します。
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards.New York Marathon'
) AS Result;
結果:
+---------------+ | Result | +---------------+ | "Fastest Dog" | +---------------+
ただし、すべての賞を抽出したい場合は、パスを$.details.awards
に短縮できます。 :
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT JSON_EXTRACT(
@json_document,
'$.details.awards'
) AS Result;
結果:
+---------------------------------------------------------------------------------------------------+ | Result | +---------------------------------------------------------------------------------------------------+ | {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} | +---------------------------------------------------------------------------------------------------+
結果をきれいにする
JSON_EXTRACT()
を渡すことで、結果を読みやすくすることができます。 JSON_DETAILED()
へ 機能:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog",
"Sumo 2020" : "Biggest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_EXTRACT(
@json_document,
'$.details.awards'
)
) AS Result;
結果:
+------------------------------------------------+ | Result | +------------------------------------------------+ | { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } | +------------------------------------------------+
ヌル引数
引数がNULL
の場合 、結果はNULL
です :
SELECT
JSON_EXTRACT(null, '$.type'),
JSON_EXTRACT('{"a":1}', null);
結果:
+------------------------------+-------------------------------+ | JSON_EXTRACT(null, '$.type') | JSON_EXTRACT('{"a":1}', null) | +------------------------------+-------------------------------+ | NULL | NULL | +------------------------------+-------------------------------+
パラメータカウントが正しくありません
引数を指定しないとエラーが発生します:
SELECT JSON_EXTRACT();
結果:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'
提供する引数が少なすぎても多すぎても同じです:
SELECT JSON_EXTRACT('{ "a": 1}');
結果:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'