Di MariaDB, JSON_OBJECTAGG()
adalah fungsi bawaan yang mengembalikan objek JSON yang berisi pasangan nilai kunci, berdasarkan dua argumennya.
Sintaks
Sintaksnya seperti ini:
JSON_OBJECTAGG(key, value)
Fungsi menerima dua ekspresi yang mengevaluasi nilai tunggal, atau dua nama kolom, sebagai argumen. Argumen pertama adalah kuncinya, dan yang kedua adalah nilainya.
Contoh
Berikut adalah contoh sederhana untuk ditunjukkan:
SELECT JSON_OBJECTAGG("name", "Homer");
Hasil:
+---------------------------------+ | JSON_OBJECTAGG("name", "Homer") | +---------------------------------+ | {"name":"Homer"} | +---------------------------------+
Meskipun contoh ini menunjukkan cara kerja fungsi, manfaat sebenarnya datang saat bekerja dengan kolom atau ekspresi lainnya.
Di bawah ini adalah contoh yang menggunakan kolom database untuk argumen.
Contoh Basis Data
Misalkan kita membuat kueri tabel:
SELECT
PetName,
DOB
FROM Pets;
Dan dapatkan set hasil berikut:
+---------+------------+ | PetName | DOB | +---------+------------+ | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +---------+------------+
Sekarang mari kita jalankan kueri yang meneruskan setiap kolom ke JSON_OBJECTAGG()
fungsi, sehingga hasilnya dikembalikan sebagai objek JSON:
SELECT JSON_OBJECTAGG(PetName, DOB)
FROM Pets
WHERE DOB < '2020-04-01';
Hasil:
+--------------------------------------------------------------------+ | JSON_OBJECTAGG(PetName, DOB) | +--------------------------------------------------------------------+ | {"Fetch":"2019-08-16", "Scratch":"2018-10-01", "Wag":"2020-03-15"} | +--------------------------------------------------------------------+
Yang kami lakukan hanyalah meneruskan nama kolom ke JSON_OBJECTAGG()
fungsi.
Kami juga menggunakan WHERE
klausa untuk mempersempit hasil sedikit.
Hasil yang Dikelompokkan
Kita dapat menggunakan SQL GROUP BY
klausa untuk menghasilkan objek JSON berdasarkan pengelompokan kolom lain.
Misalkan kita menambahkan kolom ke kueri asli kita:
SELECT
PetTypeId,
PetName,
DOB
FROM Pets;
Hasil:
+-----------+---------+------------+ | PetTypeId | PetName | DOB | +-----------+---------+------------+ | 2 | Fluffy | 2020-11-20 | | 3 | Fetch | 2019-08-16 | | 2 | Scratch | 2018-10-01 | | 3 | Wag | 2020-03-15 | | 1 | Tweet | 2020-11-28 | | 3 | Fluffy | 2020-09-17 | | 3 | Bark | NULL | | 2 | Meow | NULL | +-----------+---------+------------+
Sekarang kita memiliki PetTypeId
kolom serta PetName
dan DOB
kolom. Ini cocok dengan jenis hewan peliharaan untuk setiap hewan peliharaan.
Berikut ini contoh penggunaan GROUP BY
klausa untuk mengelompokkan hasil kami dengan PetTypeId
kolom saat menggunakan JSON_OBJECTAGG()
fungsi:
SELECT
PetTypeId,
JSON_OBJECTAGG(PetName, DOB)
FROM Pets
GROUP BY PetTypeId;
Hasil:
+-----------+--------------------------------------------------------------------------------+ | PetTypeId | JSON_OBJECTAGG(PetName, DOB) | +-----------+--------------------------------------------------------------------------------+ | 1 | {"Tweet":"2020-11-28"} | | 2 | {"Fluffy":"2020-11-20", "Scratch":"2018-10-01", "Meow":null} | | 3 | {"Fetch":"2019-08-16", "Wag":"2020-03-15", "Fluffy":"2020-09-17", "Bark":null} | +-----------+--------------------------------------------------------------------------------+
Ini memungkinkan kami untuk membuat objek JSON terpisah untuk setiap jenis hewan peliharaan.
Kueri berikut menggunakan INNER JOIN
di meja lain untuk mengembalikan jenis hewan peliharaan yang sebenarnya, bukan hanya ID.
SELECT
pt.PetType,
p.PetName,
p.DOB
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType;
Hasil:
+---------+---------+------------+ | PetType | PetName | DOB | +---------+---------+------------+ | Bird | Tweet | 2020-11-28 | | Cat | Scratch | 2018-10-01 | | Cat | Fluffy | 2020-11-20 | | Cat | Meow | NULL | | Dog | Wag | 2020-03-15 | | Dog | Fetch | 2019-08-16 | | Dog | Bark | NULL | | Dog | Fluffy | 2020-09-17 | +---------+---------+------------+
Kita dapat melihat bahwa jenis hewan peliharaan yang sebenarnya sekarang terdaftar di kolom pertama, bukan hanya ID jenis hewan peliharaan.
Sekarang mari kita gunakan JSON_OBJECTAGG()
fungsi:
SELECT
pt.PetType,
JSON_OBJECTAGG(p.PetName, p.DOB)
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType;
Hasil:
+---------+--------------------------------------------------------------------------------+ | PetType | JSON_OBJECTAGG(p.PetName, p.DOB) | +---------+--------------------------------------------------------------------------------+ | Bird | {"Tweet":"2020-11-28"} | | Cat | {"Scratch":"2018-10-01", "Fluffy":"2020-11-20", "Meow":null} | | Dog | {"Wag":"2020-03-15", "Fetch":"2019-08-16", "Bark":null, "Fluffy":"2020-09-17"} | +---------+--------------------------------------------------------------------------------+