に最終更新
JSON_SEARCH
説明
JSON_SEARCH 関数は JSON ドキュメント内の指定した値を検索します。一致した場合は値へのパスを返し、一致しない場合は NULL を返します。JSON の階層構造を再帰的に検索できます。
構文
JSON_SEARCH( <json_object>, <one_or_all>, <search_value> )
パラメータ
<json_object>: 検索対象の JSON 型ドキュメントです。<one_or_all>: 一致した値のうち、最初の一件だけを返すか、すべてを返すかを指定する文字列です。'one' または 'all' を指定します。<search_value>: 検索する文字列です。 '%' は任意の長さの文字列、'_' は任意の一文字に一致するワイルドカードとして使用できます。
戻り値
Nullable(JSON): 戻り値は <one_or_all> によって次のように変わります。
- 'one': 一致する値があれば、その値を指す JSON パスを返します。一致しなければ NULL を返します。
- 'all': 一致するすべての値のパスを返します。複数ある場合は JSON 配列として返し、一致しなければ NULL を返します。
注意事項
one_or_allが 'one' の場合は最初に一致したパス、'all' の場合は一致したすべてのパスを返します。それ以外の値はエラーになります。- 一致する値がない場合は NULL を返します。
<json_object>、<one_or_all>、<search_value>のいずれかが NULL の場合は NULL を返します。
例
-
単一の値を検索する (one)
SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John');+-----------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John') |
+-----------------------------------------------------------+
| "$.name" |
+-----------------------------------------------------------+ -
複数の値が一致しても、one ではパスを一件だけ返す
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John');+----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John') |
+----------------------------------------------------------------------------+
| "$.name" |
+----------------------------------------------------------------------------+ -
一致するすべての値を検索する (all)
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John');+----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John') |
+----------------------------------------------------------------------------+
| ["$.alias","$.name"] |
+----------------------------------------------------------------------------+ -
'%' をワイルドカードとして使用する
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%');+-------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%') |
+-------------------------------------------------------------------------+
| ["$.alias","$.name"] |
+-------------------------------------------------------------------------+ -
'_' をワイルドカードとして使用する
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "Jihn"}', 'all', 'J_hn');+----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "Jihn"}', 'all', 'J_hn') |
+----------------------------------------------------------------------------+
| ["$.alias","$.name"] |
+----------------------------------------------------------------------------+ -
ワイルドカードをエスケープする
SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "J_hn"}', 'all', 'J\_hn');+-----------------------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30, "alias": "J_hn"}', 'all', 'J\_hn') |
+-----------------------------------------------------------------------------+
| "$.alias" |
+-----------------------------------------------------------------------------+'J_hn' は "J_hn" にのみ一致し、"John" には一致しません。
-
一致する値がない場合
SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice');+------------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice') |
+------------------------------------------------------------+
| NULL |
+------------------------------------------------------------+ -
NULL パラメータ
SELECT JSON_SEARCH('{"name": "John", "age": 30}', NULL, 'Alice');+-----------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', NULL, 'Alice') |
+-----------------------------------------------------------+
| NULL |
+-----------------------------------------------------------+SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', NULL);+---------------------------------------------------------+
| JSON_SEARCH('{"name": "John", "age": 30}', 'one', NULL) |
+---------------------------------------------------------+
| NULL |
+---------------------------------------------------------+SELECT JSON_SEARCH(NULL, 'one', 'Alice');+-----------------------------------+
| JSON_SEARCH(NULL, 'one', 'Alice') |
+-----------------------------------+
| NULL |
+-----------------------------------+ -
無効な
<one_or_all>パラメータSELECT JSON_SEARCH('{"name": "John", "age": 30}', 'three', 'Alice');ERROR 1105 (HY000): errCode = 2, detailMessage = [INVALID_ARGUMENT]the one_or_all argument three is not 'one' not 'all'