MariaDB
 sql >> Teknologi Basis Data >  >> RDS >> MariaDB

MariaDB JSON_TABLE() Dijelaskan

Di MariaDB, JSON_TABLE() adalah fungsi bawaan yang mengubah data JSON menjadi bentuk relasional.

Dengan kata lain, ini memungkinkan Anda mengembalikan dokumen JSON sebagai tabel.

JSON_TABLE() fungsi diperkenalkan di MariaDB 10.6.0.

Sintaks

Sintaksnya seperti ini:

JSON_TABLE(json_doc, 
          context_path COLUMNS (column_list)
) [AS] alias

Dimana column_list seperti ini:

column[, column][, ...]

Dimana column seperti ini:

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)

Dimana on_empty seperti ini:

{NULL | DEFAULT string | ERROR} ON EMPTY

Dan on_error seperti ini:

{NULL | DEFAULT string | ERROR} ON ERROR

Contoh

Berikut ini contoh untuk didemonstrasikan.

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;

Hasil:

+------+------+--------+
| name | type | weight |
+------+------+--------+
| Wag  | Dog  |     20 |
| Bark | Dog  |     10 |
| Meow | Cat  |      7 |
+------+------+--------+

Di sini, kami memberi nama setiap kolom untuk tabel, menentukan tipe datanya, dan kemudian menentukan jalur dari dokumen JSON yang akan diterapkan ke kolom itu.

Jadi, kami memanggil kolom pertama kami name , dan kemudian memetakan simpul yang disebut name dari dokumen JSON ke kolom itu.

Kolom Ordinalitas

FOR ORDINALITY opsi dapat digunakan untuk menghitung baris, mulai dari 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;

Hasil:

+------+---------+----------+--------+
| id   | name    | type     | weight |
+------+---------+----------+--------+
|    1 | Scratch | Cat      |      8 |
|    2 | Bruce   | Kangaroo |    100 |
|    3 | Hop     | Kangaroo |    130 |
+------+---------+----------+--------+

Memeriksa Keberadaan Jalur

Anda dapat menggunakan EXISTS klausa untuk memeriksa keberadaan jalur. Jika jalur ada di dokumen JSON, hasilnya adalah 1 . Jika tidak ada, 0 dikembalikan.

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;

Hasil:

+-------+----------+------------+
| name  | type     | has_weight |
+-------+----------+------------+
| Punch | Kangaroo |          1 |
| Snap  | Cat      |          1 |
| Ruff  | Dog      |          0 |
+-------+----------+------------+

Jalur Bersarang

NESTED PATH klausa memungkinkan Anda untuk menangani dokumen JSON bersarang. Saat Anda menggunakan klausa ini, klausa ini mengubah struktur JSON bersarang menjadi beberapa baris.

Contoh:

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;

Hasil:

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

Menangani Jalur Kosong

ON EMPTY klausa menentukan apa yang akan dilakukan ketika elemen yang ditentukan oleh jalur pencarian tidak ada dalam dokumen JSON.

Contoh:

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;

Hasil:

+-------+----------+--------+
| name  | type     | weight |
+-------+----------+--------+
| Punch | Kangaroo |    200 |
| Snap  | Cat      |     12 |
| Ruff  | N/A      |   NULL |
+-------+----------+--------+

Dalam contoh ini, Ruff tidak memiliki bidang jenis dan karenanya N/A dikembalikan. Ini karena saya menetapkannya di ON EMPTY klausa untuk bidang itu.

Menangani Kesalahan

ON ERROR klausa menentukan apa yang harus dilakukan jika terjadi kesalahan struktur JSON saat mencoba mengekstrak nilai dari dokumen.

Kesalahan struktur JSON hanya terjadi saat Anda mencoba mengonversi non-skalar JSON (array atau objek) menjadi nilai skalar. Saat ON ERROR klausa tidak ada, NULL ON ERROR tersirat.

Berikut ini contoh penanganan kesalahan struktur 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;

Hasil:

+-------------------------+-------+
| product                 | sizes |
+-------------------------+-------+
| Left Handed Screwdriver | Oops! |
| Long Weight             | Oops! |
| Bottomless Coffee Cup   | None  |
+-------------------------+-------+

Di sini, saya menentukan sebuah string (Oops! ) untuk digunakan setiap kali terjadi kesalahan struktur JSON.

Dalam hal ini, saya juga menyertakan ON EMPTY ayat. Ini menunjukkan bahwa keduanya ON ERROR dan ON EMPTY klausa dapat digunakan dalam pernyataan yang sama.

Namun, penting untuk diperhatikan bahwa kesalahan konversi tipe data (misalnya, upaya untuk menyimpan nilai non-bilangan bulat ke dalam bidang bilangan bulat, atau kolom varchar terpotong) tidak dianggap sebagai kesalahan JSON sehingga tidak akan memicu ON ERROR ayat. Sebaliknya, itu akan menghasilkan peringatan.

Berikut ini contoh untuk menggambarkan apa yang saya maksud:

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;

Hasil:

+-------+------+
| name  | type |
+-------+------+
| Punch |    0 |
| Snap  |    0 |
| Ruff  |    0 |
+-------+------+
3 rows in set, 3 warnings (0.000 sec)

Mari kita tunjukkan peringatannya:

SHOW WARNINGS;

Hasil:

+---------+------+---------------------------------------------------------------------------------+
| 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. Mengumumkan ClusterControl 1.7.4:Replikasi Cluster-to-Cluster - Pemulihan Bencana Utama

  2. Membangun Database yang Sangat Tersedia untuk Moodle Menggunakan MariaDB (Replication &MariaDB Cluster)

  3. Cara Menambahkan AM/PM ke Nilai Waktu atau Datetime di MariaDB

  4. Bagaimana FROM_DAYS() Bekerja di MariaDB

  5. Cara Mencadangkan Basis Data MariaDB Moodle Anda