メインコンテンツまでスキップ
バージョン: 26.x

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'