このトピックでは、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配列の
candidate1
、candidate2
、および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列に
candidate1
、candidate2
、candidate3
などのすべての要素が含まれているかどうかを判断します。入力値のデータ型: NUMERICまたはSTRING
candidate1、candidate2、candidate3、...
要素を使用します。 複数の要素値は同じデータ型である必要があります。戻り値のデータ型: VARCHAR。
例:
指定された
vj
JSON列にCP-018673
とCP-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-018673
、1
、および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
andall
、大文字と小文字は区別されません) 、および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配列の
candidate1
、candidate2
、および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配列の1
、2
、3
のうち、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 | +------------------------------+