すべてのプロダクト
Search
ドキュメントセンター

AnalyticDB:JSON 関数

最終更新日:Jul 29, 2024

このトピックでは、AnalyticDB for MySQLでサポートされているJSON関数について説明します。

  • JSON_ARRAY_CONTAINS: JSON配列にvalueパラメーターで指定された値が含まれているかどうかを判断します。

  • JSON_ARRAY_LENGTH: JSON配列の長さを返します。

  • JSON_CONTAINS: candidateパラメーターで指定された値が、json_pathパラメーターで指定されたパスまたはtargetパラメーターで指定されたJSONドキュメントに含まれているかどうかを判断します。

  • JSON_CONTAINS_PATH: JSONドキュメントに特定のパスが含まれているかどうかを判断します。

  • JSON_EXTRACT: json配列からJSON_pathパラメーターで指定された値を返します。

  • JSON_KEYS: JSON_pathパラメーターで指定されたパス内のjson配列のすべてのキーを返します。 json_pathパラメーターを指定しない場合、この関数はルートパス $のすべてのキーを返します。これは、json_pathパラメーターを $に設定するのと同じです。

  • JSON_OVERLAPS: JSON配列のcandidate1candidate2、およびcandidate3パラメーターで指定された1つ以上の要素の値を含むデータを返します。

  • JSON_REMOVE: json_pathパラメーターで指定された1つ以上の要素をJSONパラメーターで指定されたjsonドキュメントから削除した結果を返します。 配列 [json_path,json_path,...] パラメーターを使用して、複数の要素を削除できます。

  • JSON_SIZE: JSON配列のjson_pathパラメーターで指定されたJSONオブジェクトまたは配列のサイズを返します。

  • JSON_UNQUOTE: json_valueパラメーターで指定された値の引用を解除し、値のエスケープ文字を変更した結果を返します。

JSON_ARRAY_CONTAINS

json_array_contains(json, value)
  • 説明: この関数は、JSON配列にvalueパラメーターで指定された値が含まれているかどうかを判断します。

  • 入力値のデータ型: valueパラメーターのNUMERIC、STRING、またはBOOLEAN。

  • 戻り値のデータ型: BOOLEAN。

  • 例:

    • JSON配列 [1, 2, 3] に2の要素が含まれているかどうかを確認します。 例:

      SELECT json_array_contains('[1, 2, 3]', 2);

      サンプル結果:

      +-------------------------------------+
      | json_array_contains('[1, 2, 3]', 2) |
      +-------------------------------------+
      |                1                    |
      +-------------------------------------+

JSON_ARRAY_LENGTH

json_array_length(json)
  • 説明: この関数は、JSON配列の長さを返します。

  • 入力値のデータ型: STRINGまたはJSON。

  • 戻り値のデータ型: BIGINT。

  • 例:

    • JSON配列の長さ [1, 2, 3] を返します。 例:

      SELECT json_array_length('[1, 2, 3]');

      サンプル結果:

      +--------------------------------+
      | json_array_length('[1, 2, 3]') |
      +--------------------------------+
      |                 3              |
      +--------------------------------+

JSON_CONTAINS

JSON_CONTAINS関数は、JSONパスまたはドキュメントに特定のコンテンツが含まれているかどうかを判断するために使用されます。 クエリでJSON配列インデックスを使用すると、テーブル全体のデータのスキャンやJSONドキュメント全体の解析を防ぐことができます。 これにより、クエリ効率が向上します。

JSONインデックスが使用されない

重要

V3.1.5.0以降のAnalyticDB for MySQLクラスターのみが次の構文をサポートしています。

AnalyticDB For MySQLクラスターのマイナーバージョンを表示する方法については、クラスターのマイナーバージョンを表示するにはどうすればよいですか。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

json_contains(target, candidate[, json_path])
  • 説明:

    • json_pathパラメーターを指定した場合、この関数は、candidateパラメーターで指定された値がjson_pathパラメーターで指定されたパスに含まれているかどうかを判断します。 値1はtrueを示し、値0はfalseを示します。

    • json_pathパラメーターを指定しない場合、この関数は、candidateパラメーターで指定された値が、targetパラメーターで指定されたjsonドキュメントに含まれているかどうかを判断します。 値1はtrueを示し、値0はfalseを示します。

    次のルールが適用されます。

    • targetパラメーターとcandidateパラメーターがNUMBER、BOOLEAN、STRING、NULLなどのプリミティブ型で、2つのパラメーターが同じ値に設定されている場合、candidateパラメーターで指定された値はtargetパラメーターで指定されたJSONドキュメントに含まれていると見なされます。

    • ターゲットおよび候補パラメータがJSON ARRAY型であり、候補パラメータのすべての要素がターゲットパラメータの要素に含まれている場合、候補パラメータによって指定された値は、ターゲットパラメータによって指定されたJSONドキュメントに含まれていると見なされます。

    • ターゲットパラメーターがARRAY型であり、候補パラメーターがARRAY型ではなく、候補パラメーターによって指定された値がターゲットパラメーターの要素に含まれている場合、候補パラメーターによって指定された値は、ターゲットパラメーターによって指定されたJSONドキュメントに含まれていると見なされます。

    • ターゲットおよび候補パラメータがJSON OBJECTタイプであり、候補パラメータの各キーがターゲットパラメータのキーに含まれ、候補パラメータの各キー値がターゲットパラメータの対応するキー値に含まれる場合、候補パラメータによって指定された値は、ターゲットパラメータによって指定されたJSONドキュメントに含まれると見なされます。

  • 入力値のデータ型: targetおよびcandidateパラメーターはJSON、json_pathパラメーターはJSONPATH。

  • 戻り値のデータ型: BOOLEAN。

  • 例:

    • $.aパスに1の値が含まれているかどうかを確認します。 例:

      SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}}', json '1', '$.a') as result;

      サンプル結果:

      + -------
      | 結果 |
      + --------
      | 1 |
      + -------- + 
    • $.bパスに値1が含まれているかどうかを確認します。 例:

      SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}}', json '1', '$.b') as result;

      サンプル結果:

      + -------
      | 結果 |
      + --------
      | 0 |
      + -------- + 
    • targetパラメーターで指定されたJSONドキュメントに {"d": 4} が含まれているかどうかを確認します。 例:

      SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}}', json '{"d": 4}') as result;

      サンプル結果:

      + -------
      | 結果 |
      + --------
      | 0 |
      + -------- + 

使用されるJSON配列インデックス

重要
  • V3.1.10.6以降のAnalyticDB for MySQLクラスターのみが次の構文をサポートしています。

  • 指定したJSON列のJSON配列インデックスを作成する必要があります。 詳細については、「JSON配列インデックスの作成」をご参照ください。

  • SQL文の前にEXPLAINキーワードを追加して、SQL文の実行計画を表示できます。 実行プランにScanFilterProject演算子が含まれていない場合、クエリはJSON配列インデックスを使用します。 それ以外の場合、JSON配列インデックスは使用されません。

json_contains(json_path, cast('[candidate1,candidate2,candidate3]' as json)) 
  • 説明: この関数は、特定のJSON列にcandidate1candidate2candidate3などのすべての要素が含まれているかどうかを判断します。

  • 入力値のデータ型: NUMERICまたはSTRINGcandidate1、candidate2、candidate3、...要素を使用します。 複数の要素値は同じデータ型である必要があります。

  • 戻り値のデータ型: VARCHAR。

  • 例:

    • 指定されたvj JSON列にCP-018673CP-018671が含まれているかどうかを確認します。

      SELECT  json_contains(vj, cast('["CP-018673","CP-018671"]' AS json)) FROM json_test;

      サンプル結果:

      +------------------------------------------------------------+
      |json_contains(vj, cast('["CP-018673","CP-018671"]' AS json))|                                                                    |
      +------------------------------------------------------------+
      |                    0                                       |
      +------------------------------------------------------------+
      |                    0                                       |
      +------------------------------------------------------------+
      |                    1                                       |
      +------------------------------------------------------------+
      |                    0                                       |
      +------------------------------------------------------------+
      |                    0                                       |
      +------------------------------------------------------------+
    • 指定されたvj JSON列にCP-0186731、および2が含まれているかどうかを確認します。

      SELECT json_contains(vj, cast('["CP-018673",1,2]' AS json)) FROM json_test;

      サンプル結果:

      +------------------------------------------------------------+
      |json_contains(vj, cast('["CP-018673","CP-018671"]' AS json))|                                                                    |
      +------------------------------------------------------------+
      |                    0                                       |
      +------------------------------------------------------------+
      |                    1                                       |
      +------------------------------------------------------------+
      |                    1                                       |
      +------------------------------------------------------------+
      |                    0                                       |
      +------------------------------------------------------------+
      |                    1                                       |
      +------------------------------------------------------------+

JSON_CONTAINS_PATH

json_contains_path(json, one_or_all, json_path[, path,...])
重要

V3.1.5.0以降のAnalyticDB for MySQLクラスターのみがこの機能をサポートしています。

AnalyticDB For MySQLクラスターのマイナーバージョンを表示する方法については、クラスターのマイナーバージョンを表示するにはどうすればよいですか。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

  • 説明: この関数は、JSONドキュメントに特定のパスが含まれているかどうかを判断します。

    • one_or_all'one' に設定され、JSONドキュメントに指定されたパスのいずれかが含まれている場合、1が返されます。 そうでなければ、0が返される。

    • one_or_all'all' に設定され、JSONドキュメントに指定されたすべてのパスが含まれている場合、1が返されます。 そうでなければ、0が返される。

  • 入力値のデータ型: JSONパラメーターのjson、one_or_allパラメーターのVARCHAR (有効な値: one and all、大文字と小文字は区別されません) 、およびjson_PATHパラメーターのpath。

  • 戻り値のデータ型: BOOLEAN。

  • 例:

    • JSONドキュメントに $.aパスと $.eパスの少なくとも1つが含まれているかどうかを確認します。 例:

      SELECT json_contains_path(json '{"a": 1, "b": 2, "c": {"d": 4}}', 'one', '$.a', '$.e') AS RESULT;

      サンプル結果:

      +--------+
      | result |
      +--------+
      |      1 |
      +--------+
    • JSONドキュメントに $.aパスと $.eパスが含まれているかどうかを確認します。 例:

      SELECT json_contains_path(json '{"a": 1, "b": 2, "c": {"d": 4}}', 'all', '$.a', '$.e') AS RESULT;

      サンプル結果:

      +--------+
      | result |
      +--------+
      |      0 |
      +--------+

JSON_EXTRACT

重要
  • JSON列と同様に、JSON_EXTRACT関数の戻り値はORDER BYをサポートしていません。

  • JSON_EXTRACT関数をJSON_UNQUOTE関数と一緒に使用する場合、JSON_UNQUOTE関数の入力パラメーターとして戻り値を使用する前に、CAST AS VARCHAR関数を呼び出してJSON_EXTRACT関数の戻り値をVARCHAR型に変換する必要があります。

json_extract(json, json_path)
  • 説明: この関数は、json配列からjson_pathパラメーターで指定された値を返します。

  • 入力値のデータ型: STRINGまたはJSON。

  • 戻り値のデータ型: JSON。

  • 例:

    • JSON配列 [10,20, [30, 40]] から $.1パスの値を返します。 例:

      SELECT json_extract('[10, 20, [30, 40]]', '$.1');

      サンプル結果:

      +-------------------------------------------+
      | json_extract('[10, 20, [30, 40]]', '$.1') |
      +-------------------------------------------+
      |                     20                    |
      +-------------------------------------------+

JSON_KEYS

json_keys(json, json_path)
json_keys(json)
  • 説明:

    • json_pathパラメーターを指定した場合、この関数は指定されたパス内のjson配列のすべてのキーを返します。

    • json_pathパラメーターを指定しない場合、この関数はルートパス $のすべてのキーを返します。これは、json_pathパラメーターを $に設定するのと同じです。

  • 入力値のデータ型: JSON。

    次のいずれかの方法を使用して、JSONデータを作成できます。

    • JSONデータを直接使用します。 例: json '{"a": 1, "b": {"c": 30}}'

    • CAST関数を呼び出して、明示的に文字列をJSONデータに変換します。 例: CAST('{"a": 1, "b": {"c": 30}}' AS json)

  • 戻り値のデータ型: JSON ARRAY。

  • 例:

    • $.bパスのすべてのキーを返します。 例:

      SELECT json_keys(CAST('{"a": 1, "b": {"c": 30}}' AS json),'$.b');

      サンプル結果:

      +-----------------------------------------------------------+
      | json_keys(CAST('{"a": 1, "b": {"c": 30}}' AS json),'$.b') |
      +-----------------------------------------------------------+
      |                           ["c"]                           |
      +-----------------------------------------------------------+
    • ルートパスのすべてのキーを返します。 例:

      SELECT JSON_KEYS(json '{"a": 1, "b": {"c": 30}}');

      サンプル結果:

      +--------------------------------------------+
      | JSON_KEYS(json '{"a": 1, "b": {"c": 30}}') |
      +--------------------------------------------+
      |             ["a","b"]                      |
      +--------------------------------------------+

JSON_OVERLAPS

重要
  • V3.1.10.6以降のAnalyticDB for MySQLクラスターのみが次の構文をサポートしています。

  • 指定したJSON列のJSON配列インデックスを作成する必要があります。 詳細については、「JSON配列インデックスの作成」をご参照ください。

  • SQL文の前にEXPLAINキーワードを追加して、SQL文の実行計画を表示できます。 実行プランにScanFilterProject演算子が含まれていない場合、クエリはJSON配列インデックスを使用します。 それ以外の場合、JSON配列インデックスは使用されません。

json_overlaps(json_path, cast('[candidate1,candidate2,candidate3]' as json)) 
  • 説明: この関数は、JSON配列のcandidate1candidate2、およびcandidate3パラメーターで指定された1つ以上の要素の値を含むデータを返します。

  • 入力値のデータ型: candidate1、candidate2、candidate3パラメーターのNUMERICまたはSTRING。 すべてのパラメーターの値は同じデータ型である必要があります。

  • 戻り値のデータ型: VARCHAR。

  • 例:

    • 指定されたvj JSON配列のCP-018673を含むデータを返します。

      SELECT * FROM json_test WHERE json_overlaps(vj, cast('["CP-018673"]' AS json));

      サンプル結果:

      +-----+----------------------------------------------------------------------------+
      |  id |   vj                                                                       |
      +-----+----------------------------------------------------------------------------+
      |  2  | ["CP-018673", 1, false]                                                    |
      +-----+----------------------------------------------------------------------------+
      |  3  | ["CP-018673", 1, false, {"a": 1}]                                          |
      +-----+----------------------------------------------------------------------------+
      |  5  | ["CP-018673","CP-018671","CP-018672","CP-018670","CP-018669","CP-018668"]  |
      +-----+----------------------------------------------------------------------------+
    • 指定されたvj JSON配列の123のうち、1つ以上の要素を含むデータを返します。

      SELECT * FROM json_test WHERE json_overlaps(vj, cast('[1,2,3]' AS json))

      サンプル結果:

      +-----+-------------------------------------+
      |  id |                 vj                  |
      +-----+-------------------------------------+
      |  1  | [1,2,3]                             |
      +-----+-------------------------------------+
      |  2  | ["CP-018673", 1, false]             |
      +-----+-------------------------------------+
      |  3  | ["CP-018673", 1, false, {"a": 1}]   |
      +-----+-------------------------------------+

JSON_REMOVE

json_remove(json,json_path)
json_remove(json,array[json_path])
重要

V3.1.10.0以降のAnalyticDB for MySQLクラスターのみがJSON_REMOVE機能をサポートしています。

AnalyticDB For MySQLクラスターのマイナーバージョンを表示する方法については、クラスターのマイナーバージョンを表示するにはどうすればよいですか。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

  • 説明: この関数は、json_pathパラメーターで指定された1つ以上の要素をJSONパラメーターで指定されたjsonドキュメントから削除した結果を返します。 配列 [json_path,json_path,...] パラメーターを使用して、複数の要素を削除できます。

  • 入力値のデータ型: JSONおよびjson_pathパラメーターのjson VARCHAR。

  • 戻り値のデータ型: VARCHAR。

  • 例:

    • JSONドキュメントから $.glossary.GlossDivパスを削除した結果を返します。 例:

        SELECT json_remove(
        '{
            "glossary": {
                "title": "example glossary",
                "GlossDiv": {
                    "title": "S",
                    "GlossList": {
                        "GlossEntry": {
                            "ID": "SGML",
                            "SortAs": "SGML",
                            "GlossTerm": "Standard Generalized Markup Language",
                            "Acronym": "SGML",
                            "Abbrev": "ISO 8879:1986",
                            "GlossDef": {
                                "para": "A meta-markup language, used to create markup languages such as DocBook.",
                                "GlossSeeAlso": ["GML", "XML"]
                            },
                            "GlossSee": "markup"
                        }
                    }
                }
            }
        }'
        , '$.glossary.GlossDiv') a;

      サンプル結果:

      {"glossary":{"title":"example glossary"}}
    • JSONドキュメントから $.glossary.titleおよび $.glossary.GlossDiv.titleパスを削除した結果を返します。 例:

      SELECT json_remove(
        '{
            "glossary": {
                "title": "example glossary",
                "GlossDiv": {
                    "title": "S",
                    "GlossList": {
                        "GlossEntry": {
                            "ID": "SGML",
                            "SortAs": "SGML",
                            "GlossTerm": "Standard Generalized Markup Language",
                            "Acronym": "SGML",
                            "Abbrev": "ISO 8879:1986",
                            "GlossDef": {
                                "para": "A meta-markup language, used to create markup languages such as DocBook.",
                                "GlossSeeAlso": ["GML", "XML"]
                            },
                            "GlossSee": "markup"
                        }
                    }
                }
            }
        }'
        , array['$.glossary.title', '$.glossary.GlossDiv.title']) a;

      サンプル結果:

      {"glossary":{"GlossDiv":{"GlossList":{"GlossEntry":{"GlossTerm":"Standard Generalized Markup Language","GlossSee":"markup","SortAs":"SGML","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"ID":"SGML","Acronym":"SGML","Abbrev":"ISO 8879:1986"}}}}}

JSON_SIZE

json_size(json, json_path)
  • 説明: この関数は、JSON配列からjson_pathパラメーターで指定されたJSONオブジェクトまたは配列のサイズを返します。

    説明

    json_pathパラメーターを使用してJSONオブジェクトまたは配列を指定しない場合、この関数は0を返します。

  • 入力値のデータ型: STRINGまたはJSON。

  • 戻り値のデータ型: BIGINT。

  • 例:

    • json_pathパラメーターは、jsonオブジェクトを指定します。 例:

      SELECT json_size('{"x":{"a":1, "b": 2}}', '$.x') as result;

      サンプル結果:

      +--------+
      | result |
      +--------+
      |      2 |
      +--------+
    • json_pathパラメーターは、jsonオブジェクトまたは配列を指定しません。 例:

      SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a') as result;

      サンプル結果:

      +--------+
      | result |
      +--------+
      |      0 |
      +--------+

JSON_UNQUOTE

json_unquote(json_value)
重要

V3.1.5.0以降のAnalyticDB for MySQLクラスターのみがこの機能をサポートしています。

AnalyticDB For MySQLクラスターのマイナーバージョンを表示する方法については、クラスターのマイナーバージョンを表示するにはどうすればよいですか。 クラスターのマイナーバージョンを更新するには、テクニカルサポートにお問い合わせください。

  • 説明: この関数は、json_valueパラメーターで指定された値を引用解除し、値のエスケープ文字を変更した結果を返します。

    AnalyticDB for MySQLは、json_valueパラメーターの有効性を判断しません。 json_valueパラメーターは、パラメーターがjson構文に準拠しているかどうかに関係なく、上記のロジックに基づいて処理されます。

    エスケープ文字を次の表に示します。

    脱出キャラクター

    後エスケープ

    \"

    二重引用符 (")

    \b

    Backspaceキー

    \f

    フォームフィード

    \n

    改行

    \r

    キャリッジリターン

    \t

    タブキー

    \\

    バックスラッシュ (\)

    \uXXXX

    UTF-8キャラクター

  • 入力値のデータ型: VARCHAR。

  • 戻り値のデータ型: VARCHAR。

  • 例:

    • 文字列「abc」の引用を解除した結果を返します。 例:

      SELECT json_unquote('"abc"');

      サンプル結果:

      +-----------------------+
      | json_unquote('"abc"') |
      +-----------------------+
      |          abc          |
      +-----------------------+
    • "\\t\\u0032" 文字列の引用を解除し、文字列内のエスケープ文字を変更した結果を返します。 例:

      SELECT json_unquote('"\\t\\u0032"');

      サンプル結果:

      +------------------------------+
      | json_unquote('"\\t\\u0032"') |
      +------------------------------+
      |               2              |
      +------------------------------+