MariaDBでは、 JSON_TABLE()
JSONデータをリレーショナル形式に変換する組み込み関数です。
つまり、JSONドキュメントをテーブルとして返すことができます。
JSON_TABLE()
関数はMariaDB10.6.0で導入されました。
構文
構文は次のようになります:
JSON_TABLE(json_doc,
context_path COLUMNS (column_list)
) [AS] alias
column_list
の場所 このようになります:
column[, column][, ...]
column
の場所 このようになります:
name FOR ORDINALITY
| name type PATH value_path path [on_empty] [on_error]
| name type EXISTS PATH value_path
| NESTED [PATH] path COLUMNS (column_list)
on_empty
の場所 このようになります:
{NULL | DEFAULT string | ERROR} ON EMPTY
そしてon_error
このようになります:
{NULL | DEFAULT string | ERROR} ON ERROR
例
実例を示します。
SET @json_document = '
[
{ "name": "Wag", "type": "Dog", "weight": 20 },
{ "name": "Bark", "type": "Dog", "weight": 10 },
{ "name": "Meow", "type": "Cat", "weight": 7 }
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
name VARCHAR(255) PATH '$.name',
type VARCHAR(50) PATH '$.type',
weight INT PATH '$.weight'
)
) AS json_table;
結果:
+------+------+--------+ | name | type | weight | +------+------+--------+ | Wag | Dog | 20 | | Bark | Dog | 10 | | Meow | Cat | 7 | +------+------+--------+
ここでは、テーブルの各列に名前を付け、そのデータ型を指定してから、その列に適用されるJSONドキュメントからのパスを指定します。
そのため、最初の列を name
と呼びました。 、次に name
というノードをマッピングしました JSONドキュメントからその列へ。
通常の列
FOR ORDINALITY
オプションを使用して、 1
から始まる行をカウントできます。 。
SET @json_document = '
[
{ "name": "Scratch", "type": "Cat", "weight": 8 },
{ "name": "Bruce", "type": "Kangaroo", "weight": 100 },
{ "name": "Hop", "type": "Kangaroo", "weight": 130 }
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
id FOR ORDINALITY,
name VARCHAR(255) PATH '$.name',
type VARCHAR(50) PATH '$.type',
weight INT PATH '$.weight'
)
) AS json_table;
結果:
+------+---------+----------+--------+ | id | name | type | weight | +------+---------+----------+--------+ | 1 | Scratch | Cat | 8 | | 2 | Bruce | Kangaroo | 100 | | 3 | Hop | Kangaroo | 130 | +------+---------+----------+--------+
パスの存在を確認する
EXISTS
を使用できます パスの存在を確認する句。パスがJSONドキュメントに存在する場合、結果は 1
になります。 。存在しない場合は、 0
返されます。
SET @json_document = '
[
{ "name": "Punch", "type": "Kangaroo", "weight": 200 },
{ "name": "Snap", "type": "Cat", "weight": 12 },
{ "name": "Ruff", "type": "Dog" }
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
name VARCHAR(255) PATH '$.name',
type VARCHAR(50) PATH '$.type',
has_weight INT EXISTS PATH '$.weight'
)
) AS json_table;
結果:
+-------+----------+------------+ | name | type | has_weight | +-------+----------+------------+ | Punch | Kangaroo | 1 | | Snap | Cat | 1 | | Ruff | Dog | 0 | +-------+----------+------------+
ネストされたパス
NESTED PATH
句を使用すると、ネストされたJSONドキュメントを処理できます。この句を使用すると、ネストされたJSON構造が複数の行に変換されます。
例:
SET @json_document = '
[
{ "product": "Left Handed Screwdriver", "sizes": [ "S", "M", "L" ] },
{ "product": "Long Weight", "sizes": [ "S", "L", "XL" ] },
{ "product": "Bottomless Coffee Cup" }
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
product VARCHAR(255) PATH '$.product',
NESTED PATH '$.sizes[*]' columns (
size VARCHAR(2) PATH '$'
)
)
) AS json_table;
結果:
+-------------------------+------+ | product | size | +-------------------------+------+ | Left Handed Screwdriver | S | | Left Handed Screwdriver | M | | Left Handed Screwdriver | L | | Long Weight | S | | Long Weight | L | | Long Weight | XL | | Bottomless Coffee Cup | NULL | +-------------------------+------+
空のパスの処理
ON EMPTY
句は、検索パスで指定された要素がJSONドキュメントにない場合に何が行われるかを指定します。
例:
SET @json_document = '
[
{ "name": "Punch", "type": "Kangaroo", "weight": 200 },
{ "name": "Snap", "type": "Cat", "weight": 12 },
{ "name": "Ruff"}
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
name VARCHAR(255) PATH '$.name',
type VARCHAR(50) PATH '$.type' DEFAULT "N/A" ON EMPTY,
weight INT PATH '$.weight'
)
) AS json_table;
結果:
+-------+----------+--------+ | name | type | weight | +-------+----------+--------+ | Punch | Kangaroo | 200 | | Snap | Cat | 12 | | Ruff | N/A | NULL | +-------+----------+--------+
この例では、 Ruff
タイプフィールドがないため、 N / A
が返されます。これは、 ON EMPTY
で指定したためです。 そのフィールドの句。
エラーへの対処
ON ERROR
句は、ドキュメントから値を抽出しようとしたときにJSON構造エラーが発生した場合に何をすべきかを指定します。
JSON構造体エラーは、JSON非スカラー(配列またはオブジェクト)をスカラー値に変換しようとした場合にのみ発生します。 ON ERROR
句が存在しない、 NULL ON ERROR
暗示されます。
JSON構造エラーの処理例を次に示します。
SET @json_document = '
[
{ "product": "Left Handed Screwdriver", "sizes": [ "S", "M", "L" ] },
{ "product": "Long Weight", "sizes": [ "S", "L", "XL" ] },
{ "product": "Bottomless Coffee Cup" }
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
product VARCHAR(255) PATH '$.product',
sizes VARCHAR(5) PATH '$.sizes'
DEFAULT 'Oops!' ON ERROR
DEFAULT 'None' ON EMPTY
)
) AS json_table;
結果:
+-------------------------+-------+ | product | sizes | +-------------------------+-------+ | Left Handed Screwdriver | Oops! | | Long Weight | Oops! | | Bottomless Coffee Cup | None | +-------------------------+-------+
ここでは、文字列を指定しました(おっと!
)JSON構造エラーが発生したときに使用します。
この場合、 ON EMPTY
も含めました 句。これは、両方の ON ERROR
およびONEMPTY
句は同じステートメントで使用できます。
ただし、データ型変換エラー(たとえば、非整数値を整数フィールドに格納しようとしたり、varchar列が切り捨てられたりする)はJSONエラーとは見なされないため、エラー時
句。代わりに、警告が表示されます。
これが私が何を意味するかを説明するための例です:
SET @json_document = '
[
{ "name": "Punch", "type": "Kangaroo" },
{ "name": "Snap", "type": "Cat" },
{ "name": "Ruff", "type": "Dog" }
]
';
SELECT * FROM JSON_TABLE(@json_document, '$[*]'
COLUMNS (
name VARCHAR(255) PATH '$.name',
type INT PATH '$.type' DEFAULT 'Oops!' ON ERROR
)
) AS json_table;
結果:
+-------+------+ | name | type | +-------+------+ | Punch | 0 | | Snap | 0 | | Ruff | 0 | +-------+------+ 3 rows in set, 3 warnings (0.000 sec)
警告を表示しましょう:
SHOW WARNINGS;
結果:
+---------+------+---------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+---------------------------------------------------------------------------------+ | Warning | 1366 | Incorrect integer value: 'Kangaroo' for column ``.`(temporary)`.`type` at row 1 | | Warning | 1366 | Incorrect integer value: 'Cat' for column ``.`(temporary)`.`type` at row 2 | | Warning | 1366 | Incorrect integer value: 'Dog' for column ``.`(temporary)`.`type` at row 3 | +---------+------+---------------------------------------------------------------------------------+