Di MariaDB, JSON_VALUE()
fungsi dan JSON_QUERY()
fungsi melakukan hal serupa – mereka mengembalikan data dari dokumen JSON.
Jadi apa bedanya?
Perbedaan utamanya adalah JSON_VALUE()
mengembalikan nilai skalar, sedangkan JSON_QUERY()
mengembalikan array dan objek.
Definisi
Diberikan dokumen JSON, setiap fungsi melakukan hal berikut:
JSON_VALUE()
mengembalikan skalar yang ditentukan oleh jalur.JSON_QUERY()
mengembalikan objek atau larik yang ditentukan oleh jalur.
Pemahaman saya adalah bahwa ia bekerja dengan cara ini karena standar SQL.
Jika ini menyebabkan masalah bagi Anda, Anda mungkin menemukan JSON_EXTRACT()
berfungsi lebih bermanfaat.
Skalar
Berikut adalah contoh untuk mendemonstrasikan apa yang terjadi ketika kami mencoba menggunakan kedua fungsi untuk mengekstrak skalar dari dokumen JSON.
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.name') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.name') AS JSON_QUERY;
Hasil:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Rufus | NULL | +------------+------------+
JSON_VALUE()
mengembalikan skalar seperti yang diharapkan, tetapi JSON_QUERY()
mengembalikan NULL
. Ini diharapkan, karena JSON_QUERY()
hanya mengembalikan array dan objek.
Ini adalah hasil yang sama jika kita mencoba mengembalikan data skalar dari array:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[0]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[0]') AS JSON_QUERY;
Hasil:
+------------+------------+ | JSON_VALUE | JSON_QUERY | +------------+------------+ | Top Dog | NULL | +------------+------------+
Objek
Inilah yang terjadi ketika kami mencoba menggunakan kedua fungsi untuk mengembalikan objek utuh:
SET @json_document = '{ "name" : "Rufus" }';
SELECT
JSON_VALUE(@json_document, '$') AS JSON_VALUE,
JSON_QUERY(@json_document, '$') AS JSON_QUERY;
Hasil:
+------------+----------------------+ | JSON_VALUE | JSON_QUERY | +------------+----------------------+ | NULL | { "name" : "Rufus" } | +------------+----------------------+
Kali ini JSON_QUERY()
fungsi yang berhasil.
Array
Inilah yang terjadi ketika kami mencoba menggunakan kedua fungsi untuk mengembalikan seluruh array:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards') AS JSON_QUERY;
Hasil:
+------------+------------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------------+ | NULL | [ "Top Dog", "Best Dog", "Biggest Dog" ] | +------------+------------------------------------------+
Sekali lagi, JSON_QUERY()
fungsi berhasil.
Namun, tidak ada fungsi yang berhasil saat kita menggunakan operator wildcard array untuk memilih semua elemen skalar dari array. Dalam hal ini, JSON_EXTRACT()
datang untuk menyelamatkan:
SET @json_document = '
{
"name" : "Rufus",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT
JSON_VALUE(@json_document, '$.awards[*]') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.awards[*]') AS JSON_QUERY,
JSON_EXTRACT(@json_document, '$.awards[*]') AS JSON_EXTRACT;
Hasil:
+------------+------------+----------------------------------------+ | JSON_VALUE | JSON_QUERY | JSON_EXTRACT | +------------+------------+----------------------------------------+ | Top Dog | NULL | ["Top Dog", "Best Dog", "Biggest Dog"] | +------------+------------+----------------------------------------+
Namun, jika elemen array adalah array atau objek, maka JSON_QUERY()
mengembalikannya dengan baik:
SET @json_document = '
{
"name" : "Rufus",
"scores" : [ [1, 2, 3], [8, 9], { "a" : 1 } ]
}
';
SELECT
JSON_VALUE(@json_document, '$.scores') AS JSON_VALUE,
JSON_QUERY(@json_document, '$.scores') AS JSON_QUERY;
Hasil:
+------------+------------------------------------+ | JSON_VALUE | JSON_QUERY | +------------+------------------------------------+ | NULL | [ [1, 2, 3], [8, 9], { "a" : 1 } ] | +------------+------------------------------------+