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'