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