MariaDB
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> MariaDB

MariaDB JSON_TABLE () Giải thích

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

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 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      |
+---------+------+---------------------------------------------------------------------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách DAYOFYEAR () hoạt động trong MariaDB

  2. Cách khắc phục việc xóa dữ liệu ngẫu nhiên trong MySQL &MariaDB

  3. Hướng dẫn sao chép luồng trực tuyến cụm MySQL Galera:Phần thứ hai

  4. Cách TIMESTAMPDIFF () hoạt động trong MariaDB

  5. MariaDB RTRIM () so với RTRIM_ORACLE ():Sự khác biệt là gì?