W MariaDB, JSON_OBJECTAGG() to wbudowana funkcja, która zwraca obiekt JSON zawierający pary klucz-wartość na podstawie jego dwóch argumentów.
Składnia
Składnia wygląda tak:
JSON_OBJECTAGG(key, value) Funkcja przyjmuje jako argumenty dwa wyrażenia, których wynikiem jest pojedyncza wartość lub dwie nazwy kolumn. Pierwszym argumentem jest klucz, a drugim jego wartość.
Przykład
Oto prosty przykład do zademonstrowania:
SELECT JSON_OBJECTAGG("name", "Homer"); Wynik:
+---------------------------------+
| JSON_OBJECTAGG("name", "Homer") |
+---------------------------------+
| {"name":"Homer"} |
+---------------------------------+ Chociaż ten przykład pokazuje, jak działa funkcja, prawdziwe korzyści pojawiają się podczas pracy z kolumnami lub innymi wyrażeniami.
Poniżej znajdują się przykłady, które używają kolumn bazy danych jako argumentów.
Przykład bazy danych
Załóżmy, że wysyłamy zapytanie do tabeli:
SELECT
PetName,
DOB
FROM Pets; I uzyskaj następujący zestaw wyników:
+---------+------------+ | PetName | DOB | +---------+------------+ | Fluffy | 2020-11-20 | | Fetch | 2019-08-16 | | Scratch | 2018-10-01 | | Wag | 2020-03-15 | | Tweet | 2020-11-28 | | Fluffy | 2020-09-17 | | Bark | NULL | | Meow | NULL | +---------+------------+
Uruchommy teraz zapytanie, które przekazuje każdą kolumnę do JSON_OBJECTAGG() funkcja, dzięki czemu wyniki są zwracane jako obiekt JSON:
SELECT JSON_OBJECTAGG(PetName, DOB)
FROM Pets
WHERE DOB < '2020-04-01'; Wynik:
+--------------------------------------------------------------------+
| JSON_OBJECTAGG(PetName, DOB) |
+--------------------------------------------------------------------+
| {"Fetch":"2019-08-16", "Scratch":"2018-10-01", "Wag":"2020-03-15"} |
+--------------------------------------------------------------------+
Wszystko, co zrobiliśmy, to przekazanie nazw kolumn do JSON_OBJECTAGG() funkcjonować.
Użyliśmy również WHERE klauzula, aby nieco zawęzić wyniki.
Zgrupowane wyniki
Możemy użyć SQL GROUP BY klauzula do tworzenia obiektów JSON na podstawie grupowania innej kolumny.
Załóżmy, że dodajemy kolumnę do naszego oryginalnego zapytania:
SELECT
PetTypeId,
PetName,
DOB
FROM Pets; Wynik:
+-----------+---------+------------+ | PetTypeId | PetName | DOB | +-----------+---------+------------+ | 2 | Fluffy | 2020-11-20 | | 3 | Fetch | 2019-08-16 | | 2 | Scratch | 2018-10-01 | | 3 | Wag | 2020-03-15 | | 1 | Tweet | 2020-11-28 | | 3 | Fluffy | 2020-09-17 | | 3 | Bark | NULL | | 2 | Meow | NULL | +-----------+---------+------------+
Teraz mamy PetTypeId kolumna oraz PetName i DOB kolumny. To dopasowuje typ zwierzaka do każdego zwierzaka.
Oto przykład użycia GROUP BY klauzula grupująca nasze wyniki według PetTypeId kolumna podczas korzystania z JSON_OBJECTAGG() funkcja:
SELECT
PetTypeId,
JSON_OBJECTAGG(PetName, DOB)
FROM Pets
GROUP BY PetTypeId; Wynik:
+-----------+--------------------------------------------------------------------------------+
| PetTypeId | JSON_OBJECTAGG(PetName, DOB) |
+-----------+--------------------------------------------------------------------------------+
| 1 | {"Tweet":"2020-11-28"} |
| 2 | {"Fluffy":"2020-11-20", "Scratch":"2018-10-01", "Meow":null} |
| 3 | {"Fetch":"2019-08-16", "Wag":"2020-03-15", "Fluffy":"2020-09-17", "Bark":null} |
+-----------+--------------------------------------------------------------------------------+ To pozwoliło nam stworzyć osobny obiekt JSON dla każdego typu zwierzaka.
Poniższe zapytanie używa INNER JOIN na innym stole, aby zwrócić rzeczywisty typ zwierzaka, a nie tylko identyfikator.
SELECT
pt.PetType,
p.PetName,
p.DOB
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType; Wynik:
+---------+---------+------------+ | PetType | PetName | DOB | +---------+---------+------------+ | Bird | Tweet | 2020-11-28 | | Cat | Scratch | 2018-10-01 | | Cat | Fluffy | 2020-11-20 | | Cat | Meow | NULL | | Dog | Wag | 2020-03-15 | | Dog | Fetch | 2019-08-16 | | Dog | Bark | NULL | | Dog | Fluffy | 2020-09-17 | +---------+---------+------------+
Widzimy, że rzeczywisty typ zwierzaka jest teraz wymieniony w pierwszej kolumnie, a nie tylko identyfikator typu zwierzaka.
Teraz użyjmy JSON_OBJECTAGG() funkcja:
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; Wynik:
+---------+--------------------------------------------------------------------------------+
| PetType | JSON_OBJECTAGG(p.PetName, p.DOB) |
+---------+--------------------------------------------------------------------------------+
| Bird | {"Tweet":"2020-11-28"} |
| Cat | {"Scratch":"2018-10-01", "Fluffy":"2020-11-20", "Meow":null} |
| Dog | {"Wag":"2020-03-15", "Fetch":"2019-08-16", "Bark":null, "Fluffy":"2020-09-17"} |
+---------+--------------------------------------------------------------------------------+