PolarDB-X は、MySQL 5.7 で利用可能なすべての JSON 関数をサポートしています。これらの関数は、以下に示す 5 つのカテゴリに分類されます。MySQL 5.7 の完全な仕様については、「JSON 関数」をご参照ください。
| カテゴリ | 関数 |
|---|---|
| JSON 値の作成 | JSON_ARRAY, JSON_OBJECT, JSON_QUOTE |
| JSON 値の検索 | JSON_CONTAINS, JSON_CONTAINS_PATH, JSON_EXTRACT, ->, ->>, JSON_KEYS, JSON_SEARCH |
| JSON 値の変更 | JSON_APPEND, JSON_ARRAY_APPEND, JSON_ARRAY_INSERT, JSON_INSERT, JSON_MERGE, JSON_MERGE_PATCH, JSON_MERGE_PRESERVE, JSON_REMOVE, JSON_REPLACE, JSON_SET, JSON_UNQUOTE |
| JSON 値の属性を返す | JSON_DEPTH, JSON_LENGTH, JSON_TYPE, JSON_VALID |
| JSON ユーティリティ | JSON_PRETTY, JSON_STORAGE_SIZE |
JSONPath 構文
ほとんどの JSON 関数は、JSON ドキュメント内の場所を特定するパス引数を受け入れます。パス式は常に、ドキュメントのルートを参照する $ から始まります。
| 構文 | 説明 | 例 |
|---|---|---|
$ | ドキュメントのルート | $ |
.key | JSON オブジェクトのメンバー | $.name |
[n] | JSON 配列の n 番目の要素 (0 から始まるインデックス) | $[0], $[2] |
[*] | JSON 配列のすべての要素 | $[*] |
.* | JSON オブジェクトのすべてのメンバー | $.* |
.key1.key2 | ネストされたアクセス | $.address.city |
PolarDB-X は、パスに対する二重アスタリスク (**) ワイルドカードをサポートしていません。JSON 値を作成する関数
JSON_ARRAY([val [, val] ...])
指定された値のリストから JSON 配列を返します。任意の型の値を 0 個以上受け入れます。
SELECT JSON_ARRAY(123, "polardb-x", NULL, TRUE);
+------------------------------------------+
| JSON_ARRAY(123, 'polardb-x', NULL, true) |
+------------------------------------------+
| [123,"polardb-x",null,true] |
+------------------------------------------+JSON_OBJECT([key, val [, key, val] ...])
指定されたキーと値のペアのリストから JSON オブジェクトを返します。いずれかのキーが NULL であるか、引数の数が奇数である場合はエラーを返します。
SELECT JSON_OBJECT('id', 123, 'name', 'polardb-x');
+---------------------------------------------+
| JSON_OBJECT('id', 123, 'name', 'polardb-x') |
+---------------------------------------------+
| {"name":"polardb-x","id":123} |
+---------------------------------------------+JSON_QUOTE(string)
文字列を JSON 文字列リテラルとしてラップします。つまり、文字列を二重引用符で囲み、特殊文字をエスケープします。utf8mb4 文字列を返します。引数が NULL の場合は NULL を返します。
次の例は、NULL 入力と、すでに二重引用符を含む文字列の出力を示しています。
SELECT JSON_QUOTE(null), JSON_QUOTE('"abc"');
+------------------+---------------------+
| JSON_QUOTE(NULL) | JSON_QUOTE('"abc"') |
+------------------+---------------------+
| NULL | "\"abc\"" |
+------------------+---------------------+JSON 値を検索する関数
JSON_CONTAINS(target, candidate [, path])
候補の JSON ドキュメントがターゲットに含まれている場合は 1 を、そうでない場合は 0 を返します。オプションのパス引数を使用すると、候補がターゲットのそのパスに出現するかどうかをチェックします。いずれかの引数が NULL の場合は NULL を返します。
パスが存在するかどうかのみをチェックする場合 (そのパスの値をチェックしない場合) は、代わりに JSON_CONTAINS_PATH() を使用してください。
次の例では、スカラー値、null 値、一致しないパス、ネストされたオブジェクトをチェックします。
SET @json_doc = '{"a": 123, "b": null, "c": {"d": 456}}';
-- $.a に 123 が存在することを確認
SELECT JSON_CONTAINS(@json_doc, '123', '$.a');
+----------------------------------------+
| JSON_CONTAINS(@json_doc, '123', '$.a') |
+----------------------------------------+
| 1 |
+----------------------------------------+
-- $.b に null が存在することを確認
SELECT JSON_CONTAINS(@json_doc, 'null', '$.b');
+-----------------------------------------+
| JSON_CONTAINS(@json_doc, 'null', '$.b') |
+-----------------------------------------+
| 1 |
+-----------------------------------------+
-- $.b に 123 が存在しないことを確認
SELECT JSON_CONTAINS(@json_doc, '123', '$.b');
+----------------------------------------+
| JSON_CONTAINS(@json_doc, '123', '$.b') |
+----------------------------------------+
| 0 |
+----------------------------------------+
-- $.c にネストされたオブジェクトが存在することを確認
SELECT JSON_CONTAINS(@json_doc, '{"d": 456}', '$.c');
+-----------------------------------------------+
| JSON_CONTAINS(@json_doc, '{"d": 456}', '$.c') |
+-----------------------------------------------+
| 1 |
+-----------------------------------------------+JSON_CONTAINS_PATH(json_doc, one_or_all, path[, path] ...)
ドキュメントが指定されたいずれかのパスにデータを含む場合は 1 を、そうでない場合は 0 を返します。いずれかの引数が NULL の場合は NULL を返します。
one_or_all 引数はマッチング動作を制御します:
'one':指定されたパスの 1 つ以上にデータが存在する場合は 1 を返し、それ以外の場合は 0 を返します。'all':指定されたすべてのパスにデータが存在する場合は 1 を返し、それ以外の場合は 0 を返します。
次の例では、3 つのキーを持つドキュメントを使用して、'one' と 'all' の動作をデモンストレーションします。
SET @json_doc = '{"a": 123, "b": null, "c": {"d": 456}}';
-- $.a は存在するが $.e は存在しないため、'one' は 1 を返す
SELECT JSON_CONTAINS_PATH(@json_doc, 'one', '$.a', '$.e');
+----------------------------------------------------+
| JSON_CONTAINS_PATH(@json_doc, 'one', '$.a', '$.e') |
+----------------------------------------------------+
| 1 |
+----------------------------------------------------+
-- $.e が存在しないため、'all' は 0 を返す
SELECT JSON_CONTAINS_PATH(@json_doc, 'all', '$.a', '$.e');
+----------------------------------------------------+
| JSON_CONTAINS_PATH(@json_doc, 'all', '$.a', '$.e') |
+----------------------------------------------------+
| 0 |
+----------------------------------------------------+
-- $.c.d が存在するため、'one' は 1 を返す
SELECT JSON_CONTAINS_PATH(@json_doc, 'one', '$.c.d');
+-----------------------------------------------+
| JSON_CONTAINS_PATH(@json_doc, 'one', '$.c.d') |
+-----------------------------------------------+
| 1 |
+-----------------------------------------------+JSON_EXTRACT(json_doc, path[, path] ...)
JSON ドキュメント内の指定されたパスの値を返します。複数のパスが指定された場合、一致したすべての値の配列を返します。いずれかの引数が NULL であるか、一致するパスがない場合は NULL を返します。
次の例では、単一の要素、複数の要素、およびネストされた配列を抽出します。
-- インデックス 1 の要素を抽出
SELECT JSON_EXTRACT('[123, 456, [789, 1000]]', '$[1]');
+-------------------------------------------------+
| JSON_EXTRACT('[123, 456, [789, 1000]]', '$[1]') |
+-------------------------------------------------+
| 456 |
+-------------------------------------------------+
-- 2 つの要素を抽出。配列を返す
SELECT JSON_EXTRACT('[123, 456, [789, 1000]]', '$[0]', '$[1]');
+---------------------------------------------------------+
| JSON_EXTRACT('[123, 456, [789, 1000]]', '$[0]', '$[1]') |
+---------------------------------------------------------+
| [123,456] |
+---------------------------------------------------------+
-- スカラーとネストされた配列を抽出
SELECT JSON_EXTRACT('[123, 456, [789, 1000]]', '$[0]', '$[2]');
+---------------------------------------------------------+
| JSON_EXTRACT('[123, 456, [789, 1000]]', '$[0]', '$[2]') |
+---------------------------------------------------------+
| [123,[789,1000]] |
+---------------------------------------------------------+column->path
-> 演算子は JSON_EXTRACT() の短縮形です。指定されたパスで列から値を抽出し、JSON エンコーディングを保持します (文字列は引用符で囲まれたままになります)。
SELECT JSON_OBJECT('id', 123, 'name', 'polardb-x')->"$.name" AS NAME;
+-------------+
| NAME |
+-------------+
| "polardb-x" |
+-------------+column->>path
->> 演算子は -> を拡張し、結果の引用符を解除してエスケープを解除します。JSON_UNQUOTE(JSON_EXTRACT(column, path)) または JSON_UNQUOTE(column->path) と同等です。
次の例は -> との違いを示しています。結果は引用符で囲まれずに返されます。
SELECT JSON_OBJECT('id', 123, 'name', 'polardb-x')->>"$.name" AS NAME;
+-----------+
| NAME |
+-----------+
| polardb-x |
+-----------+JSON_KEYS(json_doc[, path])
JSON オブジェクトのトップレベルのキーを JSON 配列として返します。オプションのパス引数を使用すると、そのパスのキーを返します。いずれかの引数が NULL であるか、パスの値がオブジェクトでない場合は NULL を返します。
SELECT JSON_KEYS('{"a": 123, "b": {"c": 456}}');
+------------------------------------------+
| JSON_KEYS('{"a": 123, "b": {"c": 456}}') |
+------------------------------------------+
| ["a","b"] |
+------------------------------------------+JSON_SEARCH(json_doc, one_or_all, search_str [, escape_char[, path] ...])
json_doc 内で search_str が最初に現れるパスを返します。search_str が見つからない場合や、いずれかの引数が NULL の場合は NULL を返します。LIKE 演算子と同様に、% および _ ワイルドカードをサポートします。escape_char 引数は、ワイルドカードのエスケープ文字を指定します。
PolarDB-X は、パスに対する二重アスタリスク (**) ワイルドカードをサポートしていません。one_or_all 引数は戻り値を制御します:
'one':最初に一致したパスを返します。どのパスが「最初」と見なされるかは未定義です。'all':一致するすべてのパスの配列を返します。配列内の要素の順序は未定義です。
次の例では、完全一致、一致なし (NULL を返す)、パス引数を使用したスコープ検索、ワイルドカード一致を検索します。
SET @json_doc = '["abc", [{"k1": 123}, "def"], {"k2": "abc"}, {"k3": null}]';
-- "abc" が最初に現れる場所を検索
SELECT JSON_SEARCH(@json_doc, 'one', 'abc');
+--------------------------------------+
| JSON_SEARCH(@json_doc, 'one', 'abc') |
+--------------------------------------+
| "$[0]" |
+--------------------------------------+
-- "abc" が現れるすべての場所を検索
SELECT JSON_SEARCH(@json_doc, 'all', 'abc');
+--------------------------------------+
| JSON_SEARCH(@json_doc, 'all', 'abc') |
+--------------------------------------+
| ["$[0]","$[2].k2"] |
+--------------------------------------+
-- "xyz" は存在しないため、NULL を返す
SELECT JSON_SEARCH(@json_doc, 'all', 'xyz');
+--------------------------------------+
| JSON_SEARCH(@json_doc, 'all', 'xyz') |
+--------------------------------------+
| NULL |
+--------------------------------------+
-- $[*] (トップレベルの配列要素) 内のみを検索
SELECT JSON_SEARCH(@json_doc, 'all', 'def', NULL, '$[*]');
+----------------------------------------------------+
| JSON_SEARCH(@json_doc, 'all', 'def', NULL, '$[*]') |
+----------------------------------------------------+
| "$[1][1]" |
+----------------------------------------------------+
-- % ワイルドカードを使用して "a" を含む任意の文字列に一致させる
SELECT JSON_SEARCH(@json_doc, 'all', '%a%');
+--------------------------------------+
| JSON_SEARCH(@json_doc, 'all', '%a%') |
+--------------------------------------+
| ["$[0]","$[2].k2"] |
+--------------------------------------+JSON 値を変更する関数
JSON_APPEND(json_doc, path, val [, path, val] ...)
JSON_APPEND() は MySQL 5.7 で非推奨となり、MySQL 8.0 で削除されました。代わりに JSON_ARRAY_APPEND() を使用してください。JSON_ARRAY_APPEND(json_doc, path, val [, path, val] ...)
指定されたパスにある JSON 配列の末尾に 1 つ以上の値を追加し、変更されたドキュメントを返します。パスと値のペアは左から右に評価され、各結果が次のペアの入力になります。
指定されたパスのターゲットが配列ではなくスカラー値である場合、新しい値が追加される前に、スカラーはまず単一要素の配列にラップされます。
次の例では、既存の配列とスカラー値に追加します。
SET @json_doc = '{"a": 1, "b": [2, 3], "c": 4}';
-- 既存の配列 $.b に "x" を追加
SELECT JSON_ARRAY_APPEND(@json_doc, '$.b', 'x');
+------------------------------------------+
| JSON_ARRAY_APPEND(@json_doc, '$.b', 'x') |
+------------------------------------------+
| {"a":1,"b":[2,3,"x"],"c":4} |
+------------------------------------------+
-- スカラー $.c に "y" を追加。スカラーは最初に配列にラップされる
SELECT JSON_ARRAY_APPEND(@json_doc, '$.c', 'y');
+------------------------------------------+
| JSON_ARRAY_APPEND(@json_doc, '$.c', 'y') |
+------------------------------------------+
| {"a":1,"b":[2,3],"c":[4,"y"]} |
+------------------------------------------+JSON_ARRAY_INSERT(json_doc, path, val [, path, val] ...)
特定の位置にある JSON 配列に 1 つ以上の値を挿入し、変更されたドキュメントを返します。パス内の配列の添字が配列の長さを超える場合、値は最後の要素として追加されます。パスと値のペアは左から右に評価されます。
次の例では、特定のインデックス、配列の境界外、ネストされた配列、および 2 つのパスと値のペアで挿入します。
SET @json_doc = '["a", {"b": [1, 2]}, [3, 4]]';
-- インデックス 1 の前に "x" を挿入
SELECT JSON_ARRAY_INSERT(@json_doc, '$[1]', 'x');
+-------------------------------------------+
| JSON_ARRAY_INSERT(@json_doc, '$[1]', 'x') |
+-------------------------------------------+
| ["a","x",{"b":[1,2]},[3,4]] |
+-------------------------------------------+
-- インデックス 10 は配列の範囲外。"x" は末尾に追加される
SELECT JSON_ARRAY_INSERT(@json_doc, '$[10]', 'x');
+--------------------------------------------+
| JSON_ARRAY_INSERT(@json_doc, '$[10]', 'x') |
+--------------------------------------------+
| ["a",{"b":[1,2]},[3,4],"x"] |
+--------------------------------------------+
-- ネストされた配列 $[1].b のインデックス 1 の前に "x" を挿入
SELECT JSON_ARRAY_INSERT(@json_doc, '$[1].b[1]', 'x');
+------------------------------------------------+
| JSON_ARRAY_INSERT(@json_doc, '$[1].b[1]', 'x') |
+------------------------------------------------+
| ["a",{"b":[1,"x",2]},[3,4]] |
+------------------------------------------------+
-- 2 つの挿入を順次適用。2 番目のパスは、最初の挿入後にシフトされたインデックスを反映
SELECT JSON_ARRAY_INSERT(@json_doc, '$[0]', 'x', '$[3][1]', 'y');
+-----------------------------------------------------------+
| JSON_ARRAY_INSERT(@json_doc, '$[0]', 'x', '$[3][1]', 'y') |
+-----------------------------------------------------------+
| ["x","a",{"b":[1,2]},[3,"y",4]] |
+-----------------------------------------------------------+JSON_INSERT(json_doc, path, val [, path, val] ...)
既存の値を上書きせずに JSON ドキュメントに値を挿入します。パスと値のペアは左から右に評価されます。
挿入ルールは次のとおりです:
パスにすでに値がある場合、そのペアは無視され、既存の値が保持されます。
パスが存在しない場合:
JSON オブジェクトの場合:新しいキーと値のペアを追加します。
現在の配列の長さを超える配列の添字の場合:値を追加します。スカラーは単一要素の配列としてラップされます。
それ以外の場合:ペアは無視されます。
次の例は、$.a がすでに存在するため上書きされず、新しいキー $.c が挿入されることを示しています。
SET @json_doc = '{ "a": 1, "b": [2, 3]}';
SELECT JSON_INSERT(@json_doc, '$.a', 10, '$.c', '[true, false]');
+-----------------------------------------------------------+
| JSON_INSERT(@json_doc, '$.a', 10, '$.c', '[true, false]') |
+-----------------------------------------------------------+
| {"a":1,"b":[2,3],"c":"[true, false]"} |
+-----------------------------------------------------------+JSON_INSERT()、JSON_SET()、および JSON_REPLACE() の比較については、以下の表をご参照ください。
| 関数 | パスが存在する場合 | パスが存在しない場合 |
|---|---|---|
JSON_INSERT() | ペアを無視し、既存の値を保持 | 新しい値を挿入 |
JSON_SET() | 既存の値を上書き | 新しい値を挿入 |
JSON_REPLACE() | 既存の値を上書き | ペアを無視し、変更なし |
JSON_MERGE(json_doc, json_doc [, json_doc] ...)
JSON_MERGE()は MySQL 5.7 で非推奨となり、MySQL 8.0.3 で削除されました。代わりにJSON_MERGE_PRESERVE()を使用してください。2 つの関数は同じように動作します。
JSON_MERGE_PATCH(json_doc, json_doc [, json_doc] ...)
2 つ以上の JSON ドキュメントをマージし、重複するキーを削除します。ドキュメントは、次のルールを使用して左から右にマージされます:
doc1 がオブジェクトでない場合、結果は doc2 になります。
doc2 がオブジェクトでない場合、結果は doc2 になります。
両方がオブジェクトの場合、結果には以下が含まれます:
doc2 に一致するキーがない doc1 のメンバー。
doc1 に一致するキーがなく、値が JSON の null リテラルではない doc2 のメンバー。
両方に存在するキーの場合:doc2 の値が JSON の null リテラルでない限り、doc2 の値が使用されます (再帰的にマージされます)。doc2 の値が JSON の null リテラルの場合、キーは削除されます。
次の例は、異なるキーのマージ、null を使用したキーの削除、および 3 者間マージを示しています。
-- 異なるキーを持つ 2 つのオブジェクトをマージ
SELECT JSON_MERGE_PATCH('{"name": "polardb-x"}', '{"id": 123}');
+----------------------------------------------------------+
| JSON_MERGE_PATCH('{"name": "polardb-x"}', '{"id": 123}') |
+----------------------------------------------------------+
| {"name":"polardb-x","id":123} |
+----------------------------------------------------------+
-- 2 番目のドキュメントの null 値により、キー "b" が削除される
SELECT JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}');
+--------------------------------------------------+
| JSON_MERGE_PATCH('{"a":1, "b":2}', '{"b":null}') |
+--------------------------------------------------+
| {"a":1} |
+--------------------------------------------------+
-- 3 者間マージ。"a" は最後のドキュメントの値を取る
SELECT JSON_MERGE_PATCH('{ "a": 1, "b":2 }', '{ "a": 3, "c":4 }', '{ "a": 5, "d":6 }');
+-----------------------------------------------------------------------------------+
| JSON_MERGE_PATCH('{ "a": 1, "b":2 }', '{ "a": 3, "c":4 }', '{ "a": 5, "d":6 }') |
+-----------------------------------------------------------------------------------+
| {"a":5,"b":2,"c":4,"d":6} |
+-----------------------------------------------------------------------------------+JSON_MERGE_PRESERVE(json_doc, json_doc [, json_doc] ...)
2 つ以上の JSON ドキュメントをマージし、重複するキーを含むすべてのメンバーを保持します。ドキュメントは、次のルールを使用してマージされます:
隣接する配列は単一の配列にマージされます。
隣接するオブジェクトは単一のオブジェクトにマージされます。
スカラーは、マージされる前に単一要素の配列としてラップされます。
オブジェクトを配列とマージする場合、オブジェクトはまず単一要素の配列としてラップされます。
次の例では、同じ入力に対する JSON_MERGE_PRESERVE() と JSON_MERGE_PATCH() を比較します。
-- 異なるキーを持つ 2 つのオブジェクトのマージ (PATCH と同じ結果)
SELECT JSON_MERGE_PRESERVE('{"name": "polardb-x"}', '{"id": 123}');
+-------------------------------------------------------------+
| JSON_MERGE_PRESERVE('{"name": "polardb-x"}', '{"id": 123}') |
+-------------------------------------------------------------+
| {"name":"polardb-x","id":123} |
+-------------------------------------------------------------+
-- 重複キー "b":PRESERVE は両方の値を配列として保持 ("b" を削除する PATCH とは対照的)
SELECT JSON_MERGE_PRESERVE('{"a":1, "b":2}', '{"b":null}');
+-----------------------------------------------------+
| JSON_MERGE_PRESERVE('{"a":1, "b":2}', '{"b":null}') |
+-----------------------------------------------------+
| {"a":1,"b":[2,null]} |
+-----------------------------------------------------+
-- 3 者間マージ:"a" のすべての値が配列に収集される
SELECT JSON_MERGE_PRESERVE('{ "a": 1, "b":2 }', '{ "a": 3, "c":4 }', '{ "a": 5, "d":6 }');
+------------------------------------------------------------------------------------+
| JSON_MERGE_PRESERVE('{ "a": 1, "b":2 }', '{ "a": 3, "c":4 }', '{ "a": 5, "d":6 }') |
+------------------------------------------------------------------------------------+
| {"a":[1,3,5],"b":2,"c":4,"d":6} |
+------------------------------------------------------------------------------------+JSON_REMOVE(json_doc, path [, path] ...)
JSON ドキュメントから指定されたパスの要素を削除し、変更されたドキュメントを返します。パス引数は左から右に評価され、各結果が次のパスの入力になります。指定されたパスに要素が存在しない場合、エラーは返されません。
SET @json_doc = '["a", ["b", "c"], "d"]';
-- インデックス 1 の要素 (ネストされた配列 ["b","c"]) を削除
SELECT JSON_REMOVE(@json_doc, '$[1]');
+--------------------------------+
| JSON_REMOVE(@json_doc, '$[1]') |
+--------------------------------+
| ["a","d"] |
+--------------------------------+JSON_REPLACE(json_doc, path, val [, path, val] ...)
JSON ドキュメント内の指定されたパスにある既存の値を置き換えます。パスと値のペアは左から右に評価されます。指定されたパスに値が存在しない場合、ペアは無視され、エラーは返されません。
次の例は、$.a が置き換えられる一方、$.c (存在しない) は警告なしで無視されることを示しています。
SET @json_doc = '{ "a": 1, "b": [2, 3]}';
SELECT JSON_REPLACE(@json_doc, '$.a', 10, '$.c', '[true, false]');
+------------------------------------------------------------+
| JSON_REPLACE(@json_doc, '$.a', 10, '$.c', '[true, false]') |
+------------------------------------------------------------+
| {"a":"10","b":[2,3]} |
+------------------------------------------------------------+JSON_INSERT()、JSON_SET()、および JSON_REPLACE() の比較については、JSON_INSERT() の下の動作表をご参照ください。
JSON_SET(json_doc, path, val [, path, val] ...)
JSON ドキュメント内の指定されたパスに値を挿入または更新します。パスと値のペアは左から右に評価されます。
挿入および更新ルールは次のとおりです:
パスにすでに値がある場合、既存の値は上書きされます。
パスが存在しない場合:
JSON オブジェクトの場合:新しいキーと値のペアを追加します。
現在の配列の長さを超える配列の添字の場合:値を追加します。スカラーは単一要素の配列としてラップされます。
それ以外の場合:ペアは無視されます。
次の例は、$.a が上書きされ、新しいキー $.c が挿入されることを示しています。
SET @json_doc = '{ "a": 1, "b": [2, 3]}';
SELECT JSON_SET(@json_doc, '$.a', 10, '$.c', '[true, false]');
+---------------------------------------------------------+
| JSON_SET(@json_doc, '$.a', 10, '$.c', '[true, false]') |
+---------------------------------------------------------+
| {"a":10,"b":[2,3],"c":[true,false]} |
+---------------------------------------------------------+JSON_INSERT()、JSON_SET()、および JSON_REPLACE() の比較については、JSON_INSERT() の下の動作表をご参照ください。
JSON_UNQUOTE(json_val)
JSON 文字列値の引用符を解除し、エスケープシーケンスを解釈して、結果を utf8mb4 文字列として返します。引数が NULL の場合は NULL を返します。
次の例は、プレーンな文字列、タブエスケープを含む文字列、および Unicode エスケープシーケンスの引用符解除を示しています。
-- プレーンな文字列の引用符を解除
SELECT JSON_UNQUOTE('"abc"');
+-----------------------+
| JSON_UNQUOTE('"abc"') |
+-----------------------+
| abc |
+-----------------------+
-- \t はタブ文字として解釈される
SELECT JSON_UNQUOTE('"a\\tbc"');
+--------------------------+
| JSON_UNQUOTE('"a\\tbc"') |
+--------------------------+
| a bc |
+--------------------------+
-- \t と Unicode エスケープ \u0032 (数字の "2")
SELECT JSON_UNQUOTE('"\\t\\u0032"');
+------------------------------+
| JSON_UNQUOTE('"\\t\\u0032"') |
+------------------------------+
| 2 |
+------------------------------+JSON 値の属性を返す関数
JSON_DEPTH(json_doc)
JSON ドキュメントの最大ネスト深度を整数として返します。引数が NULL の場合は NULL を返します。
深度は次のように計算されます:
空の配列、空のオブジェクト、またはスカラー値の深度は 1 です。
単一の要素を持つ配列の深度は 1 です。
すべてのメンバーの深度が 1 である JSON オブジェクトの深度は 2 です。
次の例では、深度 3 を返します。トップレベルの配列 (深度 1) には整数 (深度 1) とオブジェクト (深度 2) が含まれているため、全体の深度は 3 になります。
SELECT JSON_DEPTH('[10, {"a": 20}]');
+-------------------------------+
| JSON_DEPTH('[10, {"a": 20}]') |
+-------------------------------+
| 3 |
+-------------------------------+JSON_LENGTH(json_doc [, path])
JSON ドキュメントの長さを返します。いずれかの引数が NULL の場合は NULL を返します。オプションのパス引数を使用すると、そのパスの値の長さを返します。
長さは次のように計算されます:
スカラー値の長さは 1 です。
JSON 配列の長さは要素の数です。
JSON オブジェクトの長さはトップレベルのメンバーの数です。
ネストされた配列やオブジェクトは、親の長さに寄与しません。
次の例では 2 を返します。これは、トップレベルのオブジェクトに 2 つのメンバー (a と b) があるためです。ネストされたオブジェクト {"c": 30} はカウントされません。
SELECT JSON_LENGTH('{"a": 1, "b": {"c": 30}}');
+-----------------------------------------+
| JSON_LENGTH('{"a": 1, "b": {"c": 30}}') |
+-----------------------------------------+
| 2 |
+-----------------------------------------+JSON_TYPE(json_val)
JSON 値の型を utf8mb4 文字列として返します。引数が NULL の場合は NULL を返します。
一般的な戻り値には、OBJECT、ARRAY、STRING、INTEGER、DOUBLE、BOOLEAN、NULL があります。
次の例では、配列、整数要素、およびブール要素の型をチェックします。
SET @json_obj = '{"a": [10, true]}';
-- $.a の値は配列
SELECT JSON_TYPE(JSON_EXTRACT(@json_obj, '$.a'));
+-------------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@json_obj, '$.a')) |
+-------------------------------------------+
| ARRAY |
+-------------------------------------------+
-- 配列の最初の要素は整数
SELECT JSON_TYPE(JSON_EXTRACT(@json_obj, '$.a[0]'));
+----------------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@json_obj, '$.a[0]')) |
+----------------------------------------------+
| INTEGER |
+----------------------------------------------+
-- 配列の 2 番目の要素はブール値
SELECT JSON_TYPE(JSON_EXTRACT(@json_obj, '$.a[1]'));
+----------------------------------------------+
| JSON_TYPE(JSON_EXTRACT(@json_obj, '$.a[1]')) |
+----------------------------------------------+
| BOOLEAN |
+----------------------------------------------+JSON_VALID(val)
val が有効な JSON 値である場合は 1 を、そうでない場合は 0 を返します。引数が NULL の場合は NULL を返します。
引用符で囲まれていない文字列 hello は有効な JSON ではありませんが、引用符で囲まれた文字列 "hello" は有効な JSON であることにご注意ください。
SELECT JSON_VALID('hello'), JSON_VALID('"hello"');
+---------------------+-----------------------+
| JSON_VALID('hello') | JSON_VALID('"hello"') |
+---------------------+-----------------------+
| 0 | 1 |
+---------------------+-----------------------+JSON ユーティリティ関数
JSON_PRETTY(json_doc)
JSON ドキュメントを、インデントと改行を付けて読みやすくフォーマットして返します。引数が NULL の場合は NULL を返します。
SET @json_doc = '["abc", [{"k1": 123}, "def"], {"k2": "abc"}, {"k3": null}]';
SELECT JSON_PRETTY(@json_doc);
+---------------------------------------------------------------------------+
| JSON_PRETTY(@json_doc) |
+---------------------------------------------------------------------------+
| [
"abc",
[
{
"k1":123
},
"def"
],
{
"k2":"abc"
},
{
"k3": null
}
] |
+---------------------------------------------------------------------------+JSON_STORAGE_SIZE(json_doc)
JSON ドキュメントのバイナリ表現を格納するために使用されるバイト数を返します。引数が NULL の場合は NULL を返します。
SET @json_doc = '[999, "polardb-x", [1, 2, 3], 888.88]';
SELECT JSON_STORAGE_SIZE(@json_doc) AS Size;
+------+
| Size |
+------+
| 48 |
+------+