sql >> データベース >  >> RDS >> Mysql

JSON_SEARCH()–MySQLのJSONドキュメントで文字列へのパスを検索します

    MySQLでは、JSON_SEARCH() 関数は、JSONドキュメント内の指定された文字列へのパスを返します。

    関数の引数としてJSONドキュメントを提供します。また、検索する実際の文字列(エスケープ文字を含む)を決定する引数と、すべてのインスタンスのパスを返すか、1つだけのパスを返すかを示すキーワードも指定します。

    構文

    構文は次のようになります:

    JSON_SEARCH(json_doc, one_or_all, search_str[, escape_char[, path] ...])
    

    各引数の説明は次のとおりです。

    • json_doc 検索するJSONドキュメントです
    • one_or_all キーワードone またはalloneを使用する場合 、最初のオカレンスが見つかると、検索は停止します。つまり、関数は検索文字列の最初のインスタンスのパスのみを返します。 allの場合 を指定すると、重複するパスが含まれないように、すべてのオカレンスのパスが返されます。複数のパスがある場合、それらは配列として自動ラップされます。
    • search_str パスを返す実際の文字列です。
    • escape_char エスケープ文字として使用するオプションの文字です。空または1文字の定数である必要があります。この引数を指定しない場合(またはNULLの場合)、エスケープ文字は円記号(\)です。 。
    • path JSONドキュメント内の「トップレベル」パスがどこから始まるかを決定するためのオプションの引数です。

    search_str内 引数、% および_ 文字は、LIKEで使用した場合と同じように機能します 演算子:% 任意の数の文字(ゼロ文字を含む)に一致し、_ 正確に1文字に一致します。

    リテラルの%を指定するには または_ 検索文字列の文字の前にエスケープ文字を付けます。

    例1-基本的な使用法

    実例を示します。

    SELECT 
      JSON_SEARCH('{"Name": "Bart", "Age": 10}', 'one', 'Bart') Result;
    

    結果:

    +----------+
    | Result   |
    +----------+
    | "$.Name" |
    +----------+
    

    例2–アレイ

    配列内の文字列を検索する例を次に示します。

    SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
    SELECT JSON_SEARCH(@doc, 'one', 'Mischief') Result;
    

    結果:

    +----------------+
    | Result         |
    +----------------+
    | "$.Hobbies[1]" |
    +----------------+

    配列はゼロベースの番号付けを使用するため、この結果は2番目の要素を示します。

    例3–存在しない文字列

    存在しない文字列を指定すると、NULL値が返されます。

    SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
    SELECT JSON_SEARCH(@doc, 'one', 'Homer') Result;
    

    結果:

    +--------+
    | Result |
    +--------+
    | NULL   |
    +--------+

    json_docのいずれかがあれば、NULL値も取得します 、search_str 、またはpath 引数はNULLです または、JSONオブジェクト内にパスが存在しない場合。

    例4–文字列の複数回の出現

    JSONドキュメントに同じ文字列が複数含まれている場合、結果はoneを指定したかどうかによって異なります。 またはall 2番目の引数として。

    oneを使用する場合 、最初のオカレンスのみが返されます(少なくとも1つのオカレンスがあると想定):

    SET @doc = '{"Name": "Bart", "Friends": ["Bart", "Milhouse"]}';
    SELECT JSON_SEARCH(@doc, 'one', 'Bart') Result;
    

    結果:

    +----------+
    | Result   |
    +----------+
    | "$.Name" |
    +----------+
    

    allを使用する場合 、すべてのオカレンスのパスが返されます。複数のパスがある場合、それらは配列として自動ラップされます。

    SET @doc = '{"Name": "Bart", "Friends": ["Bart", "Milhouse"]}';
    SELECT JSON_SEARCH(@doc, 'all', 'Bart') Result;
    

    結果:

    +----------------------------+
    | Result                     |
    +----------------------------+
    | ["$.Name", "$.Friends[0]"] |
    +----------------------------+
    
    >

    指定したパスからの結果のみを返すパスを指定することもできます。詳細については、以下をご覧ください(例8 –パスの指定

    例5–ワイルドカード

    上記の構文で指定されているように、ワイルドカード文字を使用できます。たとえば、%を使用できます 任意の数の文字に一致します。

    SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
    SELECT JSON_SEARCH(@doc, 'one', 'Skate%') Result;
    

    結果:

    +----------------+
    | Result         |
    +----------------+
    | "$.Hobbies[0]" |
    +----------------+

    そして、あなたは_を使うことができます 1文字のみに一致します。

    SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
    SELECT JSON_SEARCH(@doc, 'one', 'Bar_') Result;
    

    結果:

    +----------+
    | Result   |
    +----------+
    | "$.Name" |
    +----------+
    

    _を使用する場合 前の例では、NULLの結果が得られます。

    SET @doc = '{"Name": "Bart", "Hobbies": ["Skateboarding", "Mischief"]}';
    SELECT JSON_SEARCH(@doc, 'one', 'Skate_') Result;
    

    結果:

    +--------+
    | Result |
    +--------+
    | NULL   |
    +--------+

    例6–デフォルトのエスケープ文字

    上記のワイルドカード文字のいずれかを実際に含む文字列を検索する必要がある場合は、文字をエスケープする必要があります。これにより、MySQLは(ワイルドカード文字として解釈するのではなく)文字列リテラルとして使用するようになります。

    SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
    SELECT JSON_SEARCH(@doc, 'one', 'pass\%word') Result;
    

    結果:

    +---------+
    | Result  |
    +---------+
    | "$.pwd" |
    +---------+

    一見すると、バックスラッシュは不要だと思われるかもしれません。結局のところ、これを行うと同じ結果が得られるからです。

    SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
    SELECT JSON_SEARCH(@doc, 'one', 'pass%word') Result;
    
    >

    結果:

    +---------+
    | Result  |
    +---------+
    | "$.pwd" |
    +---------+

    ただし、このアプローチの問題は、これを実行しても同じ結果が得られることです。

    SET @doc = '{"userid": "bart_simpson", "pwd": "pass%BLAH-BLAH-BLAH-word"}';
    SELECT JSON_SEARCH(@doc, 'one', 'pass%word') 'Result';
    

    結果:

    +---------+
    | Result  |
    +---------+
    | "$.pwd" |
    +---------+

    したがって、バックスラッシュは、%の単一のインスタンスのみを検索していることをMySQLに通知します。 文字列リテラルとして、ではない 他の任意の数の文字。

    同じ概念がアンダースコア文字にも当てはまります。

    これを行う場合:

    SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
    SELECT 
      JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped',
      JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';
    

    これを取得します:

    +------------+-------------+
    | Escaped    | Not Escaped |
    +------------+-------------+
    | "$.userid" | "$.userid"  |
    +------------+-------------+

    どちらのアプローチでも同じ結果が返されます。

    ただし、これを行う場合(ユーザーIDの_をJに置き換えます):

    SET @doc = '{"userid": "bartJsimpson", "pwd": "pass%word"}';
    SELECT 
      JSON_SEARCH(@doc, 'one', 'bart\_simpson') 'Escaped',
      JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';
    

    これを取得します:

    +---------+-------------+
    | Escaped | Not Escaped |
    +---------+-------------+
    | NULL    | "$.userid"  |
    +---------+-------------+

    例7–カスタムエスケープ文字

    必要に応じて、独自のエスケープ文字を指定できます。これを行うには、オプションの4番目の引数として含めます。

    これは、別のエスケープ文字を使用するように書き直された前の例です(ユーザーIDには_が含まれています 文字)。

    SET @doc = '{"userid": "bart_simpson", "pwd": "pass%word"}';
    SELECT 
      JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') 'Escaped',
      JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';
    

    結果:

    +------------+-------------+
    | Escaped    | Not Escaped |
    +------------+-------------+
    | "$.userid" | "$.userid"  |
    +------------+-------------+

    そして、_を置き換えると Jを使用 ユーザーID:

    SET @doc = '{"userid": "bartJsimpson", "pwd": "pass%word"}';
    SELECT 
      JSON_SEARCH(@doc, 'one', 'bart$_simpson', '$') 'Escaped',
      JSON_SEARCH(@doc, 'one', 'bart_simpson') 'Not Escaped';
    

    結果:

    +---------+-------------+
    | Escaped | Not Escaped |
    +---------+-------------+
    | NULL    | "$.userid"  |
    +---------+-------------+

    例8–パスを指定する

    検索を開始するパスを指定することもできます。これが例です。

    SET @data = '{  
        "Person": {    
           "Name": "Bart", 
           "Age": 10,
           "Friends": ["Bart", "Milhouse"]  
        }
     }';
    SELECT JSON_SEARCH(@data, 'all', 'Bart', NULL, '$.Person.Friends') AS 'Result';
    

    結果:

    +-----------------------+
    | Result                |
    +-----------------------+
    | "$.Person.Friends[0]" |
    +-----------------------+

    パスを指定しなかった場合、次の結果が得られます。

    SET @data = '{  
        "Person": {    
           "Name": "Bart", 
           "Age": 10,
           "Friends": ["Bart", "Milhouse"]  
        }
     }';
    SELECT JSON_SEARCH(@data, 'all', 'Bart') AS 'Result';
    

    結果:

    +------------------------------------------+
    | Result                                   |
    +------------------------------------------+
    | ["$.Person.Name", "$.Person.Friends[0]"] |
    +------------------------------------------+

    さらに、oneを指定した場合 2番目の引数として(およびpath引数を省略して)、次のようになります。

    SET @data = '{  
        "Person": {    
           "Name": "Bart", 
           "Age": 10,
           "Friends": ["Bart", "Milhouse"]  
        }
     }';
    SELECT JSON_SEARCH(@data, 'one', 'Bart') AS 'Result';
    

    結果:

    +-----------------+
    | Result          |
    +-----------------+
    | "$.Person.Name" |
    +-----------------+

    例9–空のドキュメント

    ドキュメントにパスが含まれていない場合は、NULL値を取得します。

    SELECT 
      JSON_SEARCH('{}', 'all', 'Bart') 'Result';
    

    結果:

    +--------+
    | Result |
    +--------+
    | NULL   |
    +--------+

    1. MySQL /書き込みファイルエラー(エラーコード28)

    2. MySQLでテーブル名として数字を使用することは許可されていますか?

    3. Oracleのすべての権限を持つユーザーを作成します

    4. SQLの欠落データテーブルにCreatedByとCreatedOnを挿入します