In MariaDB JSON_OBJECTAGG()
ist eine integrierte Funktion, die basierend auf ihren beiden Argumenten ein JSON-Objekt zurückgibt, das Schlüssel-Wert-Paare enthält.
Syntax
Die Syntax lautet wie folgt:
JSON_OBJECTAGG(key, value)
Die Funktion akzeptiert zwei Ausdrücke, die einen einzelnen Wert ergeben, oder zwei Spaltennamen als Argumente. Das erste Argument ist der Schlüssel und das zweite sein Wert.
Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung:
SELECT JSON_OBJECTAGG("name", "Homer");
Ergebnis:
+---------------------------------+| JSON_OBJECTAGG("Name", "Homer") |+----------------------------------------------+| {"name":"Homer"} |+---------------------------------+
Obwohl dieses Beispiel zeigt, wie die Funktion funktioniert, kommt der wirkliche Vorteil beim Arbeiten mit Spalten oder anderen Ausdrücken zum Tragen.
Nachfolgend finden Sie Beispiele, die Datenbankspalten für die Argumente verwenden.
Ein Datenbankbeispiel
Angenommen, wir fragen eine Tabelle ab:
SELECT
PetName,
DOB
FROM Pets;
Und erhalten Sie die folgende Ergebnismenge:
+---------+------------+| Haustiername | Geburtsdatum |+---------+------------+| Flauschig | 2020-11-20 || Holen | 2019-08-16 || Kratzer | 01.10.2018 || Wackeln | 2020-03-15 || Twittern | 2020-11-28 || Flauschig | 2020-09-17 || Rinde | NULL || Miau | NULL |+---------+------------+
Lassen Sie uns nun eine Abfrage ausführen, die jede Spalte an JSON_OBJECTAGG()
übergibt Funktion, sodass die Ergebnisse als JSON-Objekt zurückgegeben werden:
SELECT JSON_OBJECTAGG(PetName, DOB)
FROM Pets
WHERE DOB < '2020-04-01';
Ergebnis:
Wir haben lediglich die Spaltennamen an JSON_OBJECTAGG()
übergeben Funktion.
Wir haben auch ein WHERE
verwendet -Klausel, um die Ergebnisse etwas einzugrenzen.
Gruppierte Ergebnisse
Wir können den SQL GROUP BY
verwenden -Klausel, um JSON-Objekte basierend auf einer Gruppierung einer anderen Spalte zu erstellen.
Angenommen, wir fügen unserer ursprünglichen Abfrage eine Spalte hinzu:
SELECT
PetTypeId,
PetName,
DOB
FROM Pets;
Ergebnis:
+-----------+---------+------------+| PetTypeId | Haustiername | Geburtsdatum |+-----------+---------+------------+| 2 | Flauschig | 2020-11-20 || 3 | Holen | 2019-08-16 || 2 | Kratzer | 01.10.2018 || 3 | Wackeln | 2020-03-15 || 1 | Twittern | 2020-11-28 || 3 | Flauschig | 2020-09-17 || 3 | Rinde | NULL || 2 | Miau | NULL |+-----------+---------+------------+
Jetzt haben wir eine PetTypeId
sowie der PetName
und DOB
Säulen. Dies ordnet jedem Haustier einen Haustiertyp 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_OBJECTAGG()
verwenden Funktion:
SELECT
PetTypeId,
JSON_OBJECTAGG(PetName, DOB)
FROM Pets
GROUP BY PetTypeId;
Ergebnis:
+---+---------------------------------- ----------------------------------------------+| PetTypeId | JSON_OBJECTAGG(Tiername, Geburtsdatum) |+-----------+------------------------------ -------------------------------------------------- +| 1 | {"Tweet":"2020-11-28"} || 2 | {"Fluffy":"20.11.2020", "Scratch":"2018.10.01", "Miau":null} || 3 | {"Fetch":"2019-08-16", "Wag":"2020-03-15", "Fluffy":"2020-09-17", "Bark":null} |+----- ------+--------------------------------------------------- -------------------------------------+
Dadurch konnten wir für jeden Haustiertyp ein separates JSON-Objekt 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,
p.DOB
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType;
Ergebnis:
+---------+---------+------------+| Haustiertyp | Haustiername | Geburtsdatum |+---------+---------+------------+| Vogel | Twittern | 2020-11-28 || Katze | Kratzer | 01.10.2018 || Katze | Flauschig | 2020-11-20 || Katze | Miau | NULL || Hund | Wackeln | 2020-03-15 || Hund | Holen | 2019-08-16 || Hund | Rinde | NULL || Hund | Flauschig | 2020-09-17 |+---------+---------+------------+
Wir können sehen, dass der tatsächliche Pet-Typ jetzt in der ersten Spalte aufgeführt ist, anstatt nur die Pet-Typ-ID.
Lassen Sie uns nun JSON_OBJECTAGG()
verwenden Funktion:
SELECT
pt.PetType,
JSON_OBJECTAGG(p.PetName, p.DOB)
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType;
Ergebnis:
+---------+------------------------------------ --------------------------------------------+| Haustiertyp | JSON_OBJECTAGG(p.PetName, p.DOB) |+---------+----------------------- -------------------------------------------------- --+| Vogel | {"Tweet":"2020-11-28"} || Katze | {"Scratch":"2018-10-01", "Fluffy":"2020-11-20", "Miau":null} || Hund | {"Wag":"2020-03-15", "Fetch":"2019-08-16", "Bark":null, "Fluffy":"2020-09-17"} |+----- ----+--------------------------------------------- -----------------------------------+