Trong MariaDB, JSON_TABLE ()
là một hàm tích hợp giúp chuyển đổi dữ liệu JSON thành một dạng quan hệ.
Nói cách khác, nó cho phép bạn trả về tài liệu JSON dưới dạng bảng.
JSON_TABLE ()
chức năng đã được giới thiệu trong MariaDB 10.6.0.
Cú pháp
Cú pháp như sau:
JSON_TABLE(json_doc,
context_path COLUMNS (column_list)
) [AS] alias
Ở đâu column_list
như sau:
column[, column][, ...]
Ở đâu cột
như sau:
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)
Ở đâu on_empty
như sau:
{NULL | DEFAULT string | ERROR} ON EMPTY
Và on_error
như sau:
{NULL | DEFAULT string | ERROR} ON ERROR
Ví dụ
Đây là một ví dụ để chứng minh.
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;
Kết quả:
+------+------+--------+ | name | type | weight | +------+------+--------+ | Wag | Dog | 20 | | Bark | Dog | 10 | | Meow | Cat | 7 | +------+------+--------+
Ở đây, chúng tôi đặt tên cho từng cột cho bảng, chỉ định kiểu dữ liệu của nó và sau đó chỉ định đường dẫn từ tài liệu JSON sẽ áp dụng cho cột đó.
Vì vậy, chúng tôi đã gọi cột đầu tiên của mình là name
, và sau đó ánh xạ nút có tên name
từ tài liệu JSON đến cột đó.
Cột thứ tự
FOR ORDINATIONAL
tùy chọn có thể được sử dụng để đếm các hàng, bắt đầu từ 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;
Kết quả:
+------+---------+----------+--------+ | id | name | type | weight | +------+---------+----------+--------+ | 1 | Scratch | Cat | 8 | | 2 | Bruce | Kangaroo | 100 | | 3 | Hop | Kangaroo | 130 | +------+---------+----------+--------+
Kiểm tra sự tồn tại của một đường dẫn
Bạn có thể sử dụng EXISTS
mệnh đề để kiểm tra sự tồn tại của một đường dẫn. Nếu đường dẫn tồn tại trong tài liệu JSON, kết quả là 1
. Nếu nó không tồn tại, 0
được trả lại.
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;
Kết quả:
+-------+----------+------------+ | name | type | has_weight | +-------+----------+------------+ | Punch | Kangaroo | 1 | | Snap | Cat | 1 | | Ruff | Dog | 0 | +-------+----------+------------+
Các đường dẫn lồng nhau
NESTED PATH
mệnh đề cho phép bạn xử lý các tài liệu JSON lồng nhau. Khi bạn sử dụng mệnh đề này, nó sẽ chuyển đổi các cấu trúc JSON lồng nhau thành nhiều hàng.
Ví dụ:
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;
Kết quả:
+-------------------------+------+ | 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 | +-------------------------+------+
Xử lý các đường dẫn trống
ON EMPTY
mệnh đề chỉ định những gì sẽ được thực hiện khi phần tử được chỉ định bởi đường dẫn tìm kiếm bị thiếu trong tài liệu JSON.
Ví dụ:
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;
Kết quả:
+-------+----------+--------+ | name | type | weight | +-------+----------+--------+ | Punch | Kangaroo | 200 | | Snap | Cat | 12 | | Ruff | N/A | NULL | +-------+----------+--------+
Trong ví dụ này, Ruff
không có trường loại và do đó N / A
Được trả lại. Điều này là do tôi đã chỉ định điều đó trong ON EMPTY
mệnh đề cho trường đó.
Xử lý lỗi
LỖI BẬT
mệnh đề chỉ định những gì nên làm nếu lỗi cấu trúc JSON xảy ra khi cố gắng trích xuất giá trị từ tài liệu.
Lỗi cấu trúc JSON chỉ xảy ra khi bạn cố gắng chuyển đổi JSON không vô hướng (mảng hoặc đối tượng) thành một giá trị vô hướng. Khi LỖI BẬT
mệnh đề không có, LỖI BẬT KHÔNG ĐỦ
được ngụ ý.
Dưới đây là một ví dụ về cách xử lý lỗi cấu trúc 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;
Kết quả:
+-------------------------+-------+ | product | sizes | +-------------------------+-------+ | Left Handed Screwdriver | Oops! | | Long Weight | Oops! | | Bottomless Coffee Cup | None | +-------------------------+-------+
Ở đây, tôi đã chỉ định một chuỗi ( Rất tiếc!
) để sử dụng bất cứ khi nào xảy ra lỗi cấu trúc JSON.
Trong trường hợp này, tôi cũng bao gồm ON EMPTY
mệnh đề. Điều này chứng tỏ rằng cả ON ERROR
và ON EMPTY
mệnh đề có thể được sử dụng trong cùng một câu lệnh.
Tuy nhiên, điều quan trọng cần lưu ý là lỗi chuyển đổi kiểu dữ liệu (ví dụ:cố gắng lưu trữ giá trị không phải số nguyên vào trường số nguyên hoặc cột varchar bị cắt ngắn) không được coi là lỗi JSON và do đó sẽ không kích hoạt mã <> LỖI BẬT mệnh đề. Thay vào đó, nó sẽ tạo ra các cảnh báo.
Dưới đây là một ví dụ để minh họa ý tôi muốn nói:
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;
Kết quả:
+-------+------+ | name | type | +-------+------+ | Punch | 0 | | Snap | 0 | | Ruff | 0 | +-------+------+ 3 rows in set, 3 warnings (0.000 sec)
Hãy hiển thị các cảnh báo:
SHOW WARNINGS;
Kết quả:
+---------+------+---------------------------------------------------------------------------------+ | 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 | +---------+------+---------------------------------------------------------------------------------+