JSON_SEARCH
説明
JSON_SEARCH関数は、JSONドキュメント内で指定された値を検索するために使用されます。値が見つかった場合、その値へのパスを返します。値が見つからない場合、NULLを返します。この関数はJSONデータ構造内で再帰的に検索することができます。
構文
JSON_SEARCH( <json_object>, <one_or_all>, <search_value> )
パラメータ
<json_object>: JSON型、検索対象のJSONドキュメント。<one_or_all>: String型、マッチするすべての値を検索するかどうかを指定する。'one'または'all'を指定可能。<search_value>: String型、検索する値、検索対象。 ワイルドカードとして'%'(任意の文字数の任意の文字にマッチ)および'_'(任意の単一文字にマッチ)をサポート。
戻り値
Nullable(JSON): <one_or_all>パラメータに応じて、2つのケースがあります:
1. 'one': マッチする値が見つかった場合、マッチする値を指すJSONパスを返す。マッチする値が見つからない場合、NULLを返す。
2. '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)、複数の一致がある場合でも1つのパスのみを返す
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'