W MariaDB, JSON_ARRAYAGG()
to wbudowana funkcja, która zwraca tablicę JSON zawierającą element dla każdej wartości w danym zestawie wartości JSON lub SQL.
Funkcja działa na kolumnie lub wyrażeniu, którego wynikiem jest pojedyncza wartość. Umożliwia agregowanie zestawu wyników jako pojedynczej tablicy JSON. Każdy wiersz zestawu wyników kończy się jako pojedynczy element w tablicy.
Składnia
Składnia wygląda tak:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
Przykład
Załóżmy, że wysyłamy zapytanie do tabeli:
SELECT PetName
FROM Pets;
I uzyskaj następujący zestaw wyników:
+---------+ | PetName | +---------+ | Fluffy | | Fetch | | Scratch | | Wag | | Tweet | | Fluffy | | Bark | | Meow | +---------+
Wynikiem jest jedna kolumna, a każdy wiersz zawiera inne imię zwierzaka.
Załóżmy, że chcieliśmy, aby wszystkie zwierzaki były wymienione w tablicy JSON (tak, aby każda nazwa zwierzaka była osobnym elementem tablicy).
Możemy użyć JSON_ARRAYAGG()
funkcja właśnie to robi:
SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
Wynik:
+-------------------------------------------------------------------+ | JSON_ARRAYAGG(PetName) | +-------------------------------------------------------------------+ | ["Fluffy","Fetch","Scratch","Wag","Tweet","Fluffy","Bark","Meow"] | +-------------------------------------------------------------------+
Wszystko, co zrobiliśmy, to przekazanie nazwy kolumny do JSON_ARRAYAGG()
funkcjonować.
Wyraźne wyniki
Możemy dodać DISTINCT
klauzula usuwająca zduplikowane wartości z tablicy:
SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
Wynik:
+----------------------------------------------------------+ | JSON_ARRAYAGG(DISTINCT PetName) | +----------------------------------------------------------+ | ["Bark","Fetch","Fluffy","Meow","Scratch","Tweet","Wag"] | +----------------------------------------------------------+
Zauważ, że Fluffy
został tutaj uwzględniony tylko raz, podczas gdy Fluffy
został uwzględniony dwukrotnie w poprzednim przykładzie (ponieważ są dwa zwierzaki o nazwie Fluffy
).
Uporządkuj wyniki
Możemy użyć ORDER BY
klauzula określająca kolejność elementów tablicy:
SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
Wynik:
+-------------------------------------------------------------------+ | JSON_ARRAYAGG(PetName ORDER BY PetName DESC) | +-------------------------------------------------------------------+ | ["Wag","Tweet","Scratch","Meow","Fluffy","Fluffy","Fetch","Bark"] | +-------------------------------------------------------------------+
Ogranicz wyniki
Możemy użyć LIMIT
klauzula określająca kolejność elementów tablicy:
SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
Wynik:
+--------------------------------+ | JSON_ARRAYAGG(PetName LIMIT 3) | +--------------------------------+ | ["Fluffy","Fetch","Scratch"] | +--------------------------------+
Możemy również użyć przesunięcia dla LIMIT
klauzula:
SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2)
FROM Pets;
Wynik:
+-----------------------------------------+ | JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) | +-----------------------------------------+ | ["Scratch","Wag","Tweet"] | +-----------------------------------------+
Alternatywnie możemy pominąć LIMIT
i OFFSET
słowa kluczowe i zamień liczby (i oddziel je przecinkami), aby osiągnąć ten sam wynik:
SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3)
FROM Pets;
Wynik:
+-----------------------------------+ | JSON_ARRAYAGG(PetName LIMIT 2, 3) | +-----------------------------------+ | ["Scratch","Wag","Tweet"] | +-----------------------------------+
Zgrupowane wyniki
Możemy użyć SQL GROUP BY
klauzula do tworzenia tablic na podstawie grupowania innej kolumny.
Załóżmy, że dodajemy kolumnę do naszego oryginalnego zapytania:
SELECT
PetTypeId,
PetName
FROM Pets;
Wynik:
+-----------+---------+ | PetTypeId | PetName | +-----------+---------+ | 2 | Fluffy | | 3 | Fetch | | 2 | Scratch | | 3 | Wag | | 1 | Tweet | | 3 | Fluffy | | 3 | Bark | | 2 | Meow | +-----------+---------+
Teraz mamy PetTypeId
kolumna oraz PetName
kolumna. To dopasowuje typ zwierzaka do każdego imienia.
Oto przykład użycia GROUP BY
klauzula grupująca nasze wyniki według PetTypeId
kolumna podczas korzystania z JSON_ARRAYAGG()
funkcja:
SELECT
PetTypeId,
JSON_ARRAYAGG(PetName)
FROM Pets
GROUP BY PetTypeId;
Wynik:
+-----------+---------------------------------+ | PetTypeId | JSON_ARRAYAGG(PetName) | +-----------+---------------------------------+ | 1 | ["Tweet"] | | 2 | ["Fluffy","Scratch","Meow"] | | 3 | ["Fetch","Wag","Fluffy","Bark"] | +-----------+---------------------------------+
To pozwoliło nam stworzyć osobną tablicę 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
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType;
Wynik:
+---------+---------+ | PetType | PetName | +---------+---------+ | Bird | Tweet | | Cat | Scratch | | Cat | Fluffy | | Cat | Meow | | Dog | Wag | | Dog | Fetch | | Dog | Bark | | Dog | Fluffy | +---------+---------+
Widzimy, że każdy typ zwierzaka jest wymieniony w pierwszej kolumnie, a imię zwierzaka jest wymienione w drugiej kolumnie.
Teraz użyjmy JSON_ARRAYAGG()
funkcja:
SELECT
pt.PetType,
JSON_ARRAYAGG(p.PetName)
FROM Pets p
INNER JOIN PetTypes pt
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType;
Wynik:
+---------+--------------------------+ | PetType | JSON_ARRAYAGG(p.PetName) | +---------+--------------------------+ | Bird | Tweet | | Cat | Scratch,Fluffy,Meow | | Dog | Wag,Fetch,Bark,Fluffy | +---------+--------------------------+