メインコンテンツまでスキップ

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を返します。

  1. 単一の値を検索(one)

    SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John');
    +-----------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'John') |
    +-----------------------------------------------------------+
    | "$.name" |
    +-----------------------------------------------------------+

  2. 単一の値を検索する(one)、複数のマッチがある場合でも1つのパスのみを返す

    SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John');
    +----------------------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'one', 'John') |
    +----------------------------------------------------------------------------+
    | "$.name" |
    +----------------------------------------------------------------------------+
  3. すべての一致する値を検索 (all)

    SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John');
    +----------------------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', 'John') |
    +----------------------------------------------------------------------------+
    | ["$.alias","$.name"] |
    +----------------------------------------------------------------------------+
  4. ワイルドカードとしての '%'

    SELECT JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%');
    +-------------------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30, "alias": "John"}', 'all', '%') |
    +-------------------------------------------------------------------------+
    | ["$.alias","$.name"] |
    +-------------------------------------------------------------------------+
  5. ワイルドカードとしての '_'

    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"] |
    +----------------------------------------------------------------------------+
  6. ワイルドカードエスケープ

    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" にはマッチしません。

  1. マッチする値が見つかりません

    SELECT JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice');
    +------------------------------------------------------------+
    | JSON_SEARCH('{"name": "John", "age": 30}', 'one', 'Alice') |
    +------------------------------------------------------------+
    | NULL |
    +------------------------------------------------------------+
  2. 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 |
    +-----------------------------------+
  3. 無効な<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'