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
LIMITklausa: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
LIMITdanOFFSETkata 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 BYklausa 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
PetTypeIdkolom sertaPetNamekolom. Ini cocok dengan jenis hewan peliharaan untuk setiap nama.Berikut ini contoh penggunaan
GROUP BYklausa untuk mengelompokkan hasil kami denganPetTypeIdkolom 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 JOINdi 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 |+---------+--------------------------+