I MariaDB, JSON_ARRAYAGG()
är en inbyggd funktion som returnerar en JSON-array som innehåller ett element för varje värde i en given uppsättning JSON- eller SQL-värden.
Funktionen verkar på en kolumn eller ett uttryck som utvärderas till ett enda värde. Det gör att du kan aggregera en resultatuppsättning som en enda JSON-array. Varje rad i resultatuppsättningen slutar som ett enda element i arrayen.
Syntax
Syntaxen ser ut så här:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
Exempel
Anta att vi frågar en tabell:
SELECT PetName
FROM Pets;
Och få följande resultatuppsättning:
+--------+| PetName |+--------+| Fluffig || Hämta || Skrapa || Wag || Tweet || Fluffig || Bark || Mjau |+---------+
Resultatet är en kolumn och varje rad innehåller ett annat husdjursnamn.
Låt oss säga att vi ville att alla husdjur skulle listas i en JSON-array (så att varje husdjursnamn var sitt eget array-element).
Vi kan använda JSON_ARRAYAGG()
funktion för att göra just det:
SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
Resultat:
+------------------------------------------------------ ----------------------+| JSON_ARRAYAGG(PetName) |+-------------------------------------------------------- ----------------------------+| ["Fluffy","Hämta","Scratch","Wag","Tweet","Fluffy","Bark","Meow"] |+--------- -------------------------------------------------- --+
Allt vi gjorde var att skicka kolumnnamnet till JSON_ARRAYAGG()
fungera.
Distinkt resultat
Vi kan lägga till DISTINCT
sats för att ta bort dubbletter av värden från arrayen:
SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
Resultat:
+------------------------------------------------------ ------------+| JSON_ARRAYAGG(DISTINCT PetName) |+-------------------------------------------------------- ---------------+| ["Bark","Fetch","Fluffy","Meow","Scratch","Tweet","Wag"] |+-------------------------- -----------------------------------------------+
Lägg märke till att Fluffy
inkluderades bara en gång här, medan Fluffy
inkluderades två gånger i föregående exempel (eftersom det finns två husdjur som heter Fluffy
).
Beställ resultaten
Vi kan använda ORDER BY
sats för att specificera en ordning för arrayelementen:
SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
Resultat:
+------------------------------------------------------ ----------------------+| JSON_ARRAYAGG(PetName ORDER BY PetName DESC) |+---------------------------------------- --------------------------+| ["Wag","Tweet","Scratch","Meow","Fluffy","Fluffy","Fetch","Bark"] |+--------------- -------------------------------------------------- --+
Begränsa resultaten
Vi kan använda LIMIT
sats för att specificera en ordning för arrayelementen:
SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
Resultat:
+--------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3) |+--------------------------------+| ["Fluffig","Hämta","Scratch"] |+----------------------------------------+Vi kan också använda en offset för
LIMIT
klausul:SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) FROM Pets;
Resultat:
+------------------------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) |+---------------------------------------- -+| ["Scratch","Wag","Tweet"] |+------------------------------------------------ ------+Alternativt kan vi utelämna
LIMIT
ochOFFSET
sökord och växla mellan siffrorna (och separera dem med ett kommatecken) för att uppnå samma resultat:SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3) FROM Pets;
Resultat:
+----------------------------------------+| JSON_ARRAYAGG(PetName LIMIT 2, 3) |+----------------------------------------+| ["Scratch","Wag","Tweet"] |+------------------------------------------------ +Grupperade resultat
Vi kan använda SQL
GROUP BY
sats för att producera matriser baserade på en gruppering av en annan kolumn.Anta att vi lägger till en kolumn i vår ursprungliga fråga:
SELECT PetTypeId, PetName FROM Pets;
Resultat:
+-----------+---------+| PetTypeId | PetName |+-----------+---------+| 2 | Fluffig || 3 | Hämta || 2 | Skrapa || 3 | Wag || 1 | Tweet || 3 | Fluffig || 3 | Bark || 2 | Mjau |+-----------+---------+Nu har vi ett
PetTypeId
kolumnen samtPetName
kolumn. Detta matchar en husdjurstyp till varje namn.Här är ett exempel på hur du använder
GROUP BY
klausul för att gruppera våra resultat efterPetTypeId
kolumnen medan du använderJSON_ARRAYAGG()
funktion:SELECT PetTypeId, JSON_ARRAYAGG(PetName) FROM Pets GROUP BY PetTypeId;
Resultat:
+-----------+-----------------------------------------+ | PetTypeId | JSON_ARRAYAGG(PetName) |+-----------+-------------------------------- -+| 1 | ["Tweet"] || 2 | ["Fluffig","Scratch","Mjau"] || 3 | ["Hämta","Wag","Fluffy","Bark"] |+------+------------------- --------------+Detta gjorde det möjligt för oss att skapa en separat array för varje husdjurstyp.
Följande fråga använder en
INNER JOIN
på ett annat bord för att returnera den faktiska husdjurstypen, inte bara ID.SELECT pt.PetType, p.PetName FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId ORDER BY PetType;
Resultat:
+--------+---------+| PetType | PetName |+--------+---------+| Fågel | Tweet || Katt | Skrapa || Katt | Fluffig || Katt | Mjau || Hund | Wag || Hund | Hämta || Hund | Bark || Hund | Fluffig |+--------+---------+Vi kan se att varje husdjurstyp är listad i den första kolumnen och husdjursnamnet i den andra kolumnen.
Låt oss nu använda
JSON_ARRAYAGG()
funktion:SELECT pt.PetType, JSON_ARRAYAGG(p.PetName) FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId GROUP BY pt.PetType;
Resultat:
+--------+---------------------------------+| PetType | JSON_ARRAYAGG(p.PetName) |+--------+--------------------------------+| Fågel | Tweet || Katt | Scratch,Fluffy,Meow || Hund | Wag,Fetch,Bark,Fluffy |+--------+--------------------------------+