sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_ARRAYAGG() Förklarad

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 och OFFSET 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 samt PetName 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 efter PetTypeId kolumnen medan du använder JSON_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 |+--------+--------------------------------+

  1. Förbered en ny virtuell dator för SQL Server 2014 CTP1

  2. Okänd kolumn i "fältlista"-fel på MySQL Update-fråga

  3. Enkel parametrering och triviala planer — del 3

  4. Konvertera 'datetime2' till 'date' i SQL Server (T-SQL-exempel)