MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

MariaDB JSON_ARRAYAGG() erklärt

In MariaDB, JSON_ARRAYAGG() ist eine integrierte Funktion, die ein JSON-Array zurückgibt, das ein Element für jeden Wert in einem bestimmten Satz von JSON- oder SQL-Werten enthält.

Die Funktion wirkt auf eine Spalte oder einen Ausdruck, der zu einem einzelnen Wert ausgewertet wird. Es ermöglicht Ihnen, eine Ergebnismenge als einzelnes JSON-Array zu aggregieren. Jede Zeile der Ergebnismenge endet als einzelnes Element im Array.

Syntax

Die Syntax lautet wie folgt:

JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [LIMIT {[offset,] row_count | row_count OFFSET offset}]) 

Beispiel

Angenommen, wir fragen eine Tabelle ab:

SELECT PetName
FROM Pets; 

Und erhalten Sie die folgende Ergebnismenge:

+---------+| Tiername |+---------+| Flauschig || || holen Kratzer || Wag || Twittern || Flauschig || Rinde || Miau |+---------+

Das Ergebnis ist eine Spalte, und jede Zeile enthält einen anderen Kosenamen.

Nehmen wir an, wir wollten, dass alle Haustiere in einem JSON-Array aufgelistet werden (so dass jeder Haustiername ein eigenes Array-Element ist).

Wir können JSON_ARRAYAGG() verwenden Funktion, um genau das zu tun:

SELECT JSON_ARRAYAGG(PetName)
FROM Pets; 

Ergebnis:

+---------------------------------------------- ---------------------+| JSON_ARRAYAGG(Tiername) |+---------------------------------------------------- -----------------------+| ["Flauschig", "Fetch", "Kratz", "Wedeln", "Zwitschern", "Flauschig", "Rillen", "Miau"] |+--------------- -------------------------------------------------- --+

Wir haben lediglich den Spaltennamen an JSON_ARRAYAGG() übergeben Funktion.

Eindeutige Ergebnisse

Wir können den DISTINCT hinzufügen -Klausel zum Entfernen doppelter Werte aus dem Array:

SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets; 

Ergebnis:

+---------------------------------------------- -------------+| JSON_ARRAYAGG(DISTINCT Haustiername) |+-------------------------------------------------------- ---------------+| ["Bark","Fetch","Fluffy","Miau","Scratch","Tweet","Wag"] |+------------------ ---------------------------------------+

Beachten Sie, dass Fluffy wurde hier nur einmal eingefügt, während Fluffy war im vorherigen Beispiel zweimal enthalten (weil es zwei Haustiere namens Fluffy gibt ).

Ergebnisse anordnen

Wir können den ORDER BY verwenden -Klausel, um eine Reihenfolge für die Array-Elemente anzugeben:

SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets; 

Ergebnis:

+---------------------------------------------- ---------------------+| JSON_ARRAYAGG(PetName ORDER BY PetName DESC) |+---------------------------------------- ----------------------------+| ["Wackeln","Zwitschern","Kratzen","Miauen","Flauschig","Flauschig","Fetch","Bell"] |+--------------- -------------------------------------------------- --+

Begrenzen Sie die Ergebnisse

Wir können das LIMIT verwenden -Klausel, um eine Reihenfolge für die Array-Elemente anzugeben:

SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets; 

Ergebnis:

+-------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3) |+-------------------------------+| ["Flauschig","Fetch","Kratz"] |+-------------------------------+ 

Wir können auch einen Offset für das LIMIT verwenden Klausel:

SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2)
FROM Pets; 

Ergebnis:

+------------------------------------+| JSON_ARRAYAGG(Haustiername LIMIT 3 OFFSET 2) |+---------------------------------------- -+| ["Scratch","Wag","Tweet"] |+----------------------------------- ------+

Alternativ können wir das LIMIT weglassen und OFFSET Keywords, und vertauschen Sie die Zahlen (und trennen Sie sie durch ein Komma), um dasselbe Ergebnis zu erzielen:

SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3)
FROM Pets; 

Ergebnis:

+-----------------------------------+| JSON_ARRAYAGG(PetName LIMIT 2, 3) |+-----------------------------------+| ["Scratch","Wag","Tweet"] |+----------------------------------- +

Gruppierte Ergebnisse

Wir können den SQL GROUP BY verwenden -Klausel, um Arrays basierend auf einer Gruppierung einer anderen Spalte zu erstellen.

Angenommen, wir fügen unserer ursprünglichen Abfrage eine Spalte hinzu:

SELECT 
    PetTypeId,
    PetName
FROM Pets; 

Ergebnis:

+-----------+---------+| PetTypeId | Tiername |+-----------+---------+| 2 | Flauschig || 3 | || holen 2 | Kratzer || 3 | Wag || 1 | Twittern || 3 | Flauschig || 3 | Rinde || 2 | Miau |+-----------+---------+

Jetzt haben wir eine PetTypeId sowie der PetName Säule. Dies ordnet jedem Namen einen Pet-Typ zu.

Hier ist ein Beispiel für die Verwendung von GROUP BY -Klausel, um unsere Ergebnisse nach PetTypeId zu gruppieren -Spalte, während Sie JSON_ARRAYAGG() verwenden Funktion:

SELECT 
    PetTypeId,
    JSON_ARRAYAGG(PetName)
FROM Pets
GROUP BY PetTypeId; 

Ergebnis:

+-----------+---------------------------------+ | PetTypeId | JSON_ARRAYAGG(Tiername) |+-----------+-------------------------------- -+| 1 | ["Twittern"] || 2 | ["Flauschig","Kratz","Miau"] || 3 | ["Fetch","Wag","Fluffy","Bark"] |+-----------+------------------- --------------+

Dadurch konnten wir für jeden Haustiertyp ein separates Array erstellen.

Die folgende Abfrage verwendet einen INNER JOIN in einer anderen Tabelle, um den tatsächlichen Tiertyp zurückzugeben, nicht nur die ID.

SELECT 
    pt.PetType,
    p.PetName
FROM Pets p 
INNER JOIN PetTypes pt 
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType; 

Ergebnis:

+---------+---------+| Haustiertyp | Tiername |+---------+---------+| Vogel | Twittern || Katze | Kratzer || Katze | Flauschig || Katze | Miau || Hund | Wag || Hund | || holen Hund | Rinde || Hund | Flauschig |+---------+---------+

Wir können sehen, dass jeder Pet-Typ in der ersten Spalte aufgeführt ist und der Name des Pets in der zweiten Spalte aufgeführt ist.

Lassen Sie uns nun JSON_ARRAYAGG() verwenden Funktion:

SELECT 
    pt.PetType,
    JSON_ARRAYAGG(p.PetName)
FROM Pets p 
INNER JOIN PetTypes pt 
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType; 

Ergebnis:

+---------+---------------------+| Haustiertyp | JSON_ARRAYAGG(p.PetName) |+---------+--------------------------+| Vogel | Twittern || Katze | Kratzen, Flauschig, Miau || Hund | Wedeln, Holen, Bellen, Flauschig |+---------+--------------------------+