Di MariaDB, JSON_ARRAYAGG()
adalah fungsi bawaan yang mengembalikan larik JSON yang berisi elemen untuk setiap nilai dalam kumpulan nilai JSON atau SQL tertentu.
Fungsi bekerja pada kolom atau ekspresi yang mengevaluasi ke nilai tunggal. Ini memungkinkan Anda untuk menggabungkan kumpulan hasil sebagai larik JSON tunggal. Setiap baris dari kumpulan hasil berakhir sebagai elemen tunggal dalam larik.
Sintaks
Sintaksnya seperti ini:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
Contoh
Misalkan kita membuat kueri tabel:
SELECT PetName
FROM Pets;
Dan dapatkan set hasil berikut:
+---------+| Nama Hewan Peliharaan |+---------+| Halus || Ambil || Goresan || Goyang || Tweet || Halus || Kulit kayu || Meow |+---------+
Hasilnya adalah satu kolom, dan setiap baris berisi nama hewan peliharaan yang berbeda.
Katakanlah kita ingin semua hewan peliharaan dicantumkan dalam larik JSON (sehingga setiap nama hewan peliharaan adalah elemen lariknya sendiri).
Kita dapat menggunakan JSON_ARRAYAGG()
berfungsi untuk melakukan hal itu:
SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
Hasil:
+------------------------------------------------- ----------+| JSON_ARRAYAGG(Nama Hewan Peliharaan) |+-------------------------------------------------------- -----------------------+| ["Fluffy",,"Ambil",,"Scratch",,"Wag",,"Tweet",,"Fluffy",,"Bark",,"Meow"] |+--------------- -------------------------------------------------- --+
Yang kami lakukan hanyalah meneruskan nama kolom ke JSON_ARRAYAGG()
fungsi.
Hasil Berbeda
Kita dapat menambahkan DISTINCT
klausa untuk menghapus nilai duplikat dari array:
SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
Hasil:
+------------------------------------------------- ------------+| JSON_ARRAYAGG(Nama Hewan Peliharaan BERBEDA) |+------------------------------------------- ---------------+| ["Bark",,"Ambil",,"Fluffy",,"Meow",,"Scratch",,"Tweet",,"Wag"] |+------------------- --------------------------------------------------+
Perhatikan bahwa Fluffy
hanya disertakan sekali di sini, sedangkan Fluffy
dimasukkan dua kali dalam contoh sebelumnya (karena ada dua hewan peliharaan yang disebut Fluffy
).
Pesan Hasil
Kita dapat menggunakan ORDER BY
klausa untuk menentukan urutan elemen array:
SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
Hasil:
+------------------------------------------------- ----------+| JSON_ARRAYAGG(PetName ORDER BY PetName DESC) |+---------------------------------------- ---------------------------+| ["Wag", "Tweet", "Gores", "Meong", "Fluffy", "Fluffy", "Ambil","Bark"] |+--------------- -------------------------------------------------- --+
Batasi Hasil
Kita dapat menggunakan LIMIT
klausa untuk menentukan urutan elemen array:
SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
Hasil:
+--------------------------------+| JSON_ARRAYAGG(Batas Nama Hewan Peliharaan 3) |+--------------------------------+| ["Fluffy",,"Ambil","Scratch"] |+--------------------------------+Kami juga dapat menggunakan offset untuk
LIMIT
klausa:SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) FROM Pets;
Hasil:
+-----------------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) |+---------------------------------------- -+| ["Scratch", "Wag", "Tweet"] |+----------------------------------- ------+Atau, kita dapat menghilangkan
LIMIT
danOFFSET
kata kunci, dan ganti angkanya (dan pisahkan dengan koma) untuk mendapatkan hasil yang sama:SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3) FROM Pets;
Hasil:
+-----------------------------------+| JSON_ARRAYAGG(Nama Hewan Peliharaan BATAS 2, 3) |+------------------------------------+| ["Scratch", "Wag", "Tweet"] |+----------------------------------- +Hasil yang Dikelompokkan
Kita dapat menggunakan SQL
GROUP BY
klausa untuk menghasilkan array berdasarkan pengelompokan kolom lain.Misalkan kita menambahkan kolom ke kueri asli kita:
SELECT PetTypeId, PetName FROM Pets;
Hasil:
+-----------+--------+| PetTypeId | PetName |+------------+---------+| 2 | Halus || 3 | Ambil || 2 | Goresan || 3 | Goyang || 1 | Tweet || 3 | Halus || 3 | Kulit kayu || 2 | Meow |+------------+---------+Sekarang kita memiliki
PetTypeId
kolom sertaPetName
kolom. Ini cocok dengan jenis hewan peliharaan untuk setiap nama.Berikut ini contoh penggunaan
GROUP BY
klausa untuk mengelompokkan hasil kami denganPetTypeId
kolom saat menggunakanJSON_ARRAYAGG()
fungsi:SELECT PetTypeId, JSON_ARRAYAGG(PetName) FROM Pets GROUP BY PetTypeId;
Hasil:
+-----------+---------------------------------+ | PetTypeId | JSON_ARRAYAGG(Nama Hewan Peliharaan) |+-----------+-------------------------------- -+| 1 | ["Tweet"] || 2 | ["Fluffy",,"Scratch",,"Meow"] || 3 | ["Ambil",,"Wag",,"Fluffy",,"Bark"] |+-----------+------------------- --------------+Ini memungkinkan kami untuk membuat larik 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 FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId ORDER BY PetType;
Hasil:
+---------+---------+| Jenis Hewan Peliharaan | PetName |+---------+---------+| Burung | Tweet || Kucing | Goresan || Kucing | Halus || Kucing | Meong || Anjing | Goyang || Anjing | Ambil || Anjing | Kulit kayu || Anjing | Fluffy |+---------+---------+Kita dapat melihat bahwa setiap jenis hewan peliharaan terdaftar di kolom pertama dan nama hewan peliharaan tercantum di kolom kedua.
Sekarang mari kita gunakan
JSON_ARRAYAGG()
fungsi:SELECT pt.PetType, JSON_ARRAYAGG(p.PetName) FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId GROUP BY pt.PetType;
Hasil:
+---------+--------------------------+| Jenis Hewan Peliharaan | JSON_ARRAYAGG(p.PetName) |+---------+--------------------------+| Burung | Tweet || Kucing | Gores, Halus, Meong || Anjing | Wag,Fetch,Bark,Fluffy |+---------+--------------------------+