この Topic では、AnalyticDB for MySQL クラスターでサポートされている JSON 関数について説明します。
JSON_ARRAY_CONTAINS: JSON 配列に
valueパラメーターで指定された値が含まれているかどうかを確認します。JSON_ARRAY_LENGTH: JSON 配列の長さを返します。
JSON_CONTAINS (バージョン 3.1.5.0 以降): 指定されたパスに
candidateの値が含まれているかどうかを確認します。パスが指定されていない場合、この関数はターゲットにcandidateで指定された値が含まれているかどうかを確認します。JSON_CONTAINS_PATH (バージョン 3.1.5.0 以降): JSON ドキュメントに指定されたパスのいずれかまたはすべてが含まれているかどうかを確認します。
JSON_EXTRACT: JSON ドキュメントから
json_pathパラメーターで指定された値を返します。JSON_KEYS:
json_pathで指定されたパスにある JSON オブジェクトのすべてのキーを返します。json_pathが指定されていない場合、この関数はルートパス (json_path='$') のすべてのキーを返します。JSON_OVERLAPS (バージョン 3.1.10.6 以降): JSON ドキュメントに、
candidate1、candidate2、candidate3などの指定された候補要素のいずれかが含まれているかどうかを確認します。JSON_REMOVE (バージョン 3.1.10.0 以降):
jsonドキュメントからjson_pathで指定された要素を削除し、新しい文字列を返します。配列に複数のパスを指定して、複数の要素を削除できます。JSON_SIZE:
json_pathパラメーターで指定された JSON オブジェクトまたは配列のサイズを返します。JSON_SET (バージョン 3.2.2.8 以降): 指定された
json_pathのjsonドキュメントにデータを挿入または更新し、更新されたjsonドキュメントを返します。JSON_UNQUOTE (バージョン 3.1.5.0 以降):
json_valueから二重引用符を削除し、json_value内の指定されたエスケープ文字をアンエスケープして、結果を返します。
JSON_ARRAY_CONTAINS
json_array_contains(json, value)説明: JSON 配列に指定された
valueが含まれているかどうかを確認します。入力値の型:
valueパラメーターは、数値、文字列、または 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 インデックスなし
この構文は、バージョン 3.1.5.0 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新する には、AnalyticDB for MySQL コンソール にログインし、クラスター情報 ページの 構成情報 セクションに移動します。
json_contains(target, candidate[, json_path])説明:
json_pathが指定されている場合、この関数はパスにcandidate値が含まれているかどうかを確認します。true の場合は 1 を、false の場合は 0 を返します。json_pathが指定されていない場合、この関数はターゲットドキュメントにcandidate値が含まれているかどうかを確認します。true の場合は 1 を、false の場合は 0 を返します。
次のルールが適用されます:
targetとcandidateが両方とも NUMBER、BOOLEAN、STRING、NULL などのプリミティブ型である場合、`target` はそれらが等しい場合に `candidate` を含みます。targetとcandidateが両方とも JSON 配列である場合、`candidate` のすべての要素が `target` の要素でもある場合に `target` は `candidate` を含みます。targetが配列でcandidateがそうでない場合、`candidate` が `target` の要素である場合に `target` は `candidate` を含みます。targetとcandidateが両方とも JSON オブジェクトである場合、`candidate` のすべてのキーが `target` にも存在し、`candidate` の各キーの値が `target` の対応する値に含まれている場合に `target` は `candidate` を含みます。
入力値の型:
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;次の結果が返されます:
+--------+ | result | +--------+ | 1 | +--------+パス
$.bに値 1 が含まれているかどうかを確認します。文は次のとおりです:SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}', json '1', '$.b') as result;次の結果が返されます:
+--------+ | result | +--------+ | 0 | +--------+{"d": 4}がターゲットに含まれているかどうかを確認します。文は次のとおりです:SELECT json_contains(json '{"a": 1, "b": 2, "c": {"d": 4}}', json '{"d": 4}') as result;次の結果が返されます:
+--------+ | result | +--------+ | 0 | +--------+
JSON 配列インデックスの使用
この構文は、バージョン 3.1.10.6 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
指定された JSON 列に JSON 配列インデックスを作成します。詳細については、「JSON 配列インデックスの作成」をご参照ください。
SQL 文の前に
EXPLAINを追加して、その実行計画を表示できます。実行計画に ScanFilterProject オペレーターが含まれていない場合、JSON 配列インデックスはクエリに正常に使用されました。それ以外の場合、JSON 配列インデックスは使用されませんでした。
json_contains(json_path, cast('[candidate1,candidate2,candidate3]' as json)) 説明: JSON ドキュメントに、
candidate1、candidate2、candidate3などの指定されたすべての要素が含まれているかどうかを確認します。入力値の型:
candidate1, candidate2, candidate3, ...の値は、数値または文字列にすることができ、すべて同じデータ型である必要があります。戻り値の型: VARCHAR。
例:
指定された JSON 列
vjに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 | +------------------------------------------------------------+指定された JSON 列
vjに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[, json_path,...])この関数は、バージョン 3.1.5.0 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新する には、AnalyticDB for MySQL コンソール にログインし、クラスター情報 ページの 構成情報 セクションに移動します。
説明: JSON ドキュメントに指定されたパスに値が含まれているかどうかを確認します。
one_or_allが'one'に設定されている場合、この関数は JSON ドキュメントに指定されたパスの少なくとも 1 つが含まれている場合に 1 を返します。それ以外の場合は 0 を返します。one_or_allが'all'に設定されている場合、この関数は JSON ドキュメントに指定されたすべてのパスが含まれている場合に 1 を返します。それ以外の場合は 0 を返します。
入力値の型:
jsonパラメーターは JSON 型です。one_or_allパラメーターは VARCHAR 型です。有効な値は'one'または'all'で、大文字と小文字は区別されません。json_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_EXTRACT 関数の戻り値は、JSON 型の列と同様に
ORDER BYをサポートしていません。JSON_EXTRACT 関数を JSON_UNQUOTE 関数とともに使用する場合、JSON_UNQUOTE 関数の入力パラメーターとして使用する前に、まず CAST AS VARCHAR を使用して JSON_EXTRACT の戻り値を VARCHAR 型に変換する必要があります。
json_extract(json, json_path)説明: JSON ドキュメントから
json_pathで指定された値を返します。jsonのキーに$や.などの特殊文字が含まれている場合、json_pathのフォーマットは'$["Key"]'である必要があります。たとえば、キーが
$dataの場合、`json_path` を'$["$data"]'として指定します。入力値の型: STRING または JSON。
戻り値の型: JSON。
例:
配列
[10, 20, [30, 40]]からパス `$[0]` の値を返します。文は次のとおりです:SELECT json_extract('[10, 20, [30, 40]]', '$[0]');次の結果が返されます:
+-------------------------------------------+ | json_extract('[10, 20, [30, 40]]', '$[0]') | +-------------------------------------------+ | 10 | +-------------------------------------------+{"id":"1","$date":"12345"}から `$date` パスの値を返します。文は次のとおりです:SELECT JSON_EXTRACT('{"id":"1","$date":"12345"}', '$["$date"]');次の結果が返されます:
+---------------------------------------------------------+ |JSON_EXTRACT('{"id":"1","$date":"12345"}', '$["$date"]') | +---------------------------------------------------------+ | "12345" | +---------------------------------------------------------+
JSON_KEYS
json_keys(json[, json_path])説明
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 配列。
例:
$.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
この構文は、バージョン 3.1.10.6 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
指定された JSON 列に JSON 配列インデックスを作成します。詳細については、「JSON 配列インデックスの作成」をご参照ください。
SQL 文の前に
EXPLAINを追加して、その実行計画を表示できます。実行計画に ScanFilterProject オペレーターが含まれていない場合、JSON 配列インデックスはクエリに正常に使用されました。それ以外の場合、JSON 配列インデックスは使用されませんでした。
json_overlaps(json, cast('[candidate1,candidate2,candidate]' as json)) 説明: JSON ドキュメントに、
candidate1、candidate2、candidate3などの指定された要素のいずれかが含まれているかどうかを確認します。入力値の型:
candidate1, candidate2, candidate3, ...パラメーターは、数値または文字列の値を受け入れます。すべての値は同じデータ型である必要があります。戻り値の型: VARCHAR。
例:
指定された JSON 列
vjから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"] | +-----+----------------------------------------------------------------------------+指定された JSON 列
vjから、要素1、2、または3のいずれかを含むデータを返します。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 関数は、バージョン 3.1.10.0 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新する には、AnalyticDB for MySQL コンソール にログインし、クラスター情報 ページの 構成情報 セクションに移動します。
json_remove(json,json_path)
json_remove(json,array[json_path,json_path,...])説明:
jsonドキュメントからjson_pathで指定された 1 つ以上の要素を削除し、新しい文字列を返します。`array[json_path, json_path, ...]` のように配列に複数のパスを指定して、複数の要素を削除できます。入力値の型:
jsonパラメーターは JSON フォーマットの VARCHAR 文字列です。json_pathパラメーターは JSON フォーマットの VARCHAR 文字列です。戻り値の型: VARCHAR。
例
パス
$.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"}}パス
$.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_pathで指定された JSON オブジェクトまたは JSON 配列のサイズを返します。説明この関数は、
json_pathが JSON オブジェクトまたは JSON 配列を指していない場合、0 を返します。入力値の型: STRING または JSON。
戻り値の型: BIGINT。
例:
json_pathは JSON オブジェクトを指します。文は次のとおりです:SELECT json_size('{"x":{"a":1, "b": 2}}', '$.x') as result;次の結果が返されます:
+--------+ | result | +--------+ | 2 | +--------+json_pathは JSON オブジェクトまたは JSON 配列を指していません。文は次のとおりです:SELECT json_size('{"x": {"a": 1, "b": 2}}', '$.x.a') as result;次の結果が返されます:
+--------+ | result | +--------+ | 0 | +--------+
JSON_SET
JSON_SET 関数は、バージョン 3.2.2.8 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新する には、AnalyticDB for MySQL コンソール にログインし、クラスター情報 ページの 構成情報 セクションに移動します。
json_set(json, json_path, value[, json_path, value] ...)説明: 指定された
json_pathのjsonドキュメントにデータを挿入または更新し、更新されたjsonドキュメントを返します。jsonまたはjson_pathパラメーターが null の場合、この関数は null を返します。jsonが有効な JSON ドキュメントでない場合、またはいずれかのjson_pathが有効なパス式でない場合は、例外がスローされます。指定された
json_pathが存在する場合、その値は新しいvalueで上書きされます。指定された
json_pathがjsonに存在しない場合:json_pathが JSON オブジェクトを指している場合、valueはjson_pathで指定された場所に新しい要素として追加されます。json_pathが JSON 配列を指している場合、この関数はjson_pathで指定された位置の前に空のスロットがあるかどうかを確認します。空のスロットが存在する場合、valueが挿入される前に `null` 値で埋められます。それ以外の場合、valueは直接挿入されます。その他の場合は例外がスローされます。
入力値の型:
json: VARCHAR または JSON。json_path: VARCHAR。value: BOOLEAN、TINYINT、SMALLINT、INT、BIGINT、FLOAT、DOUBLE、DECIMAL、VARCHAR、VARBINARY、DATE、DATETIME、TIMESTAMP、または TIME。
戻り値の型: JSON。
例:
json_pathが null のjsonドキュメントにデータを挿入します。SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', null, '10');結果:
+------------------------------------------------+ | JSON_SET('{ "a": 1, "b": [2, 3]}', NULL, '10') | +------------------------------------------------+ | null | +------------------------------------------------+json_pathが有効なパス式でないjsonドキュメントにデータを挿入します。SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b.c', '10');結果:
Failed to execute json_set() for json_path: $.b.cjsonドキュメントにデータを挿入します。パスjson_path1は存在しますが、json_path2は存在せず、JSON オブジェクトを指しています。SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.c', '[true, false]');結果:
+-----------------------------------------------------------------------+ | JSON_SET('{ "a": 1, "b": [2, 3]}', '$.a', 10, '$.c', '[true, false]') | +-----------------------------------------------------------------------+ | {"a":10,"b":[2,3],"c":"[true, false]"} | +-----------------------------------------------------------------------+jsonドキュメントにデータを挿入します。指定されたjson_pathは存在せず、JSON 配列を指しています。SELECT JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b[4]', '[true, false]');結果:
+----------------------------------------------------------------+ | JSON_SET('{ "a": 1, "b": [2, 3]}', '$.b[4]', '[true, false]') | +----------------------------------------------------------------+ | {"a":1,"b":[2,3,null,null,"[true, false]"]} | +----------------------------------------------------------------+
JSON_UNQUOTE
json_unquote(json_value)この関数は、バージョン 3.1.5.0 以降の AnalyticDB for MySQL クラスターでのみサポートされています。
AnalyticDB for MySQL クラスターの マイナーバージョンを表示および更新する には、AnalyticDB for MySQL コンソール にログインし、クラスター情報 ページの 構成情報 セクションに移動します。
説明:
json_valueの引用符を解除し、外側の二重引用符を削除し、値内の特定の文字をアンエスケープして、結果を返します。AnalyticDB for MySQL は
json_valueパラメーターを検証しません。json_valueパラメーターは、パラメーターが JSON 構文に準拠しているかどうかに関係なく、前述のロジックに基づいて処理されます。次の表に、サポートされているエスケープ文字を示します。
エスケープ前
エスケープ後
\"二重引用符 (
")。\bバックスペース。
\fフォームフィード。
\nラインフィード。
\rキャリッジリターン。
\tタブ。
\\バックスラッシュ (
\)。\uXXXXUTF-8 文字表現。
入力値の型: VARCHAR。
戻り値の型: VARCHAR。
例:
引用符を解除した文字列
abcを返します。文は次のとおりです:SELECT json_unquote('"abc"');次の結果が返されます:
+-----------------------+ | json_unquote('"abc"') | +-----------------------+ | abc | +-----------------------+引用符を解除し、解析された文字列を返します。文は次のとおりです:
SELECT json_unquote('"\\t\\u0032"');次の結果が返されます:
+------------------------------+ | json_unquote('"\\t\\u0032"') | +------------------------------+ | 2 | +------------------------------+
付録: JSON パス構文
使用法
$.keyName[.keyName]...を使用して、JSON オブジェクト内の指定されたキーにアクセスします。$[nonNegativeInteger]を使用して、JSON 配列の n 番目の要素にアクセスします。ここで、n は非負の整数です。$.keyName[.keyName]...[nonNegativeInteger]を使用して、JSON オブジェクト内のネストされた JSON 配列の n 番目の要素にアクセスします。ここで、n は非負の整数です。
注意
AnalyticDB for MySQL の JSON パス構文は、ワイルドカード文字 * および ** をサポートしていません。たとえば、式 '$.*'、'$.hobbies[*]'、'$.address.**'、および '$.hobbies.**' はサポートされていません。
例
次の JSON データがあると仮定します。
{
"name": "Alice",
"age": 25,
"address": {
"city": "Hangzhou",
"zip": "10001"
},
"hobbies":["reading", "swimming", "cycling"]
}説明 | 正しい例 | 誤った例 |
name キーの値にアクセスする | $.name | name |
ネストされたオブジェクトの city キーの値にアクセスする | $.address.city | $.address[0] |
hobbies JSON 配列の最初の要素にアクセスする | $.hobbies[0] | $.hobbies.[0] |
よくある質問
JSON_OVERLAPS 関数の使用時に java.lang.NullPointerException エラーを解決するにはどうすればよいですか?
原因: このエラーは、ALTER 文を使用して JSON インデックスを作成した後に BUILD 操作が実行されなかったか、BUILD 操作が完了していないために発生します。この場合、JSON インデックスは有効になっていません。
ソリューション:
BUILD タスクが実行されなかった場合:
AnalyticDB for MySQL クラスターは、特定の条件が満たされた後、BUILD タスクを自動的にトリガーします。また、BUILD タスクを手動でトリガーすることもできます。
BUILD タスクが実行された場合:
次の文を実行して、BUILD タスクのステータスをクエリします。
statusフィールドの値がFINISHの場合、BUILD 操作は完了です。SELECT table_name, schema_name, status FROM INFORMATION_SCHEMA.KEPLER_META_BUILD_TASK ORDER BY create_time DESC LIMIT 10;
BUILD の詳細については、「BUILD」をご参照ください。
リファレンス
JSON: JSON 型について学びます。
JSON インデックス: JSON オブジェクトまたは JSON 配列のインデックスを作成する方法を学びます。