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 | +---------+--------------------------+