MySQLでは、JSON_VALUE()
関数は、指定されたパスでJSONドキュメントから値を抽出します。
この関数はMySQL8.0.21で導入されました。
構文
構文は次のようになります:
JSON_VALUE(json_doc, path [RETURNING type] [on_empty] [on_error])
場所:
on_empty:
{NULL | ERROR | DEFAULT value} ON EMPTY
on_error:
{NULL | ERROR | DEFAULT value} ON ERROR
例
簡単な例を次に示します。
SELECT JSON_VALUE( '{ "name" : "Wag", "type" : "Dog" }', '$.type' );
結果:
Dog
配列
配列から値を取得する例を次に示します。
SELECT JSON_VALUE( '{ "name" : "Wag", "scores" : [ 25, 36, 48 ] }', '$.scores[1]' );
結果:
36
配列はゼロベースなので、1
2番目の要素を返します(0
最初を返します)。
埋め込みドキュメント
埋め込みオブジェクトから値を取得する例を次に示します。
SELECT JSON_VALUE(
'{
"_id" : 1,
"details" : {
"name" : "Wag",
"type" : "Dog"
}
}',
'$.details.type'
);
結果:
Dog
リターンタイプ
返品タイプを指定する例を次に示します。
SELECT JSON_VALUE(
'{
"_id" : 1,
"details" : {
"name" : "Wag",
"type" : "Dog"
}
}',
'$.details' RETURNING json
);
結果:
{"name": "Wag", "type": "Dog"}
戻りタイプを指定しない場合、戻りタイプはVARCHAR(512)
です。 。
空の結果
デフォルトでは、指定されたパスにデータが見つからない場合、NULL
返されます:
SELECT JSON_VALUE(
'{
"name" : "Wag",
"type" : "Dog"
}',
'$.score'
);
結果:
NULL
ただし、次のオプションを使用して、指定されたパスでデータが見つからない場合に何が発生するかを明示的に指定できます。
-
NULL ON EMPTY
:関数はNULL
を返します;これがデフォルトの動作です。 -
DEFAULT
:提供されたvalue
空の場合value
が返されます。値のタイプは、戻りタイプのタイプと一致する必要があります。 ERROR ON EMPTY
:関数はエラーをスローします。
例:
SELECT JSON_VALUE(
'{
"name" : "Wag",
"type" : "Dog"
}',
'$.score'
DEFAULT 'Nothing found' ON EMPTY
);
結果:
Nothing found
エラー
以下を使用して、エラーが発生したときに何が発生するかを指定できます。
-
NULL ON ERROR
:JSON_VALUE()
NULL
を返します;これがデフォルトの動作です。 -
DEFAULT
:これは返される値です。その値は、戻りタイプの値と一致する必要があります。value
エラー時 -
ERROR ON ERROR
:エラーがスローされます。
使用する場合は、ON EMPTY
ON ERROR
の前に置く必要があります 句。間違った順序で指定すると、構文エラーが発生します。
インデックス
MySQL 8.0.21リリースノートに記載されているように、JSON_VALUE()
関数は、JSON
でのインデックスの作成を簡素化します 列。 JSON_VALUE(
json_doc
への呼び出し 、path
type
を返す )CAST( JSON_UNQUOTE( JSON_EXTRACT(
。json_doc
、path
))AS type
)
リリースノートで使用されている例は次のとおりです。
CREATE TABLE inventory(
items JSON,
INDEX i1 ( (JSON_VALUE(items, '$.name' RETURNING CHAR(50))) ),
INDEX i2 ( (JSON_VALUE(items, '$.price' RETURNING DECIMAL(5,2))) ),
INDEX i3 ( (JSON_VALUE(items, '$.quantity' RETURNING UNSIGNED)) )
);