No MariaDB,
JSON_ARRAYAGG()
é uma função interna que retorna uma matriz JSON contendo um elemento para cada valor em um determinado conjunto de valores JSON ou SQL. A função atua em uma coluna ou expressão que avalia um único valor. Ele permite agregar um conjunto de resultados como uma única matriz JSON. Cada linha do conjunto de resultados termina como um único elemento na matriz.
Sintaxe
A sintaxe fica assim:
JSON_ARRAYAGG([DISTINCT] expr [,expr ...]
[ORDER BY {unsigned_integer | col_name | expr}
[ASC | DESC] [,col_name ...]]
[LIMIT {[offset,] row_count | row_count OFFSET offset}])
Exemplo
Suponha que consultamos uma tabela:
SELECT PetName
FROM Pets;
E obtenha o seguinte conjunto de resultados:
+---------+| PetName |+---------+| Fofo || Buscar || Raspe || Wag || Tweet || Fofo || Casca || Miau |+---------+
O resultado é uma coluna e cada linha contém um nome de animal de estimação diferente.
Digamos que queríamos que todos os animais de estimação fossem listados em uma matriz JSON (para que cada nome de animal de estimação fosse seu próprio elemento de matriz).
Podemos usar o
JSON_ARRAYAGG()
função para fazer exatamente isso:SELECT JSON_ARRAYAGG(PetName)
FROM Pets;
Resultado:
+---------------------------------------------- ----------+| JSON_ARRAYAGG(PetName) |+-------------------------------------------- -----------------------+| ["Fofo","Pegar","Raspar","Abanar","Tweet","Fofo","Latir","Miau"] |+--------------- -------------------------------------------------- --+
Tudo o que fizemos foi passar o nome da coluna para o
JSON_ARRAYAGG()
função. Resultados distintos
Podemos adicionar o
DISTINCT
cláusula para remover valores duplicados do array:SELECT JSON_ARRAYAGG(DISTINCT PetName)
FROM Pets;
Resultado:
+---------------------------------------------- ------------+| JSON_ARRAYAGG(DISTINCT PetName) |+------------------------------------------------------ ---------------+| ["Latido","Pegar","Fofo","Miau","Arranhão","Tweet","Abanar"] |+----- ----------------------------+
Observe que
Fluffy
foi incluído apenas uma vez aqui, enquanto Fluffy
foi incluído duas vezes no exemplo anterior (porque existem dois animais de estimação chamados Fluffy
). Ordenar os resultados
Podemos usar o
ORDER BY
cláusula para especificar uma ordem para os elementos da matriz:SELECT JSON_ARRAYAGG(PetName ORDER BY PetName DESC)
FROM Pets;
Resultado:
+---------------------------------------------- ----------+| JSON_ARRAYAGG(PetName ORDER BY PetName DESC) |+--------------------------------------------------- ---------------------------+| ["Wag","Tweet","Scratch","Miau","Fofo","Fofo","Busca","Latido"] |+--------------- -------------------------------------------------- --+
Limitar os resultados
Podemos usar o
LIMIT
cláusula para especificar uma ordem para os elementos da matriz:SELECT JSON_ARRAYAGG(PetName LIMIT 3)
FROM Pets;
Resultado:
+--------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3) |+--------------------------------+| ["Fofo","Pegar","Raspadinha"] |+--------------------------------+
Também podemos usar um deslocamento para oLIMIT
cláusula:
SELECT JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) FROM Pets;
Resultado:
+-----------------------------------------+| JSON_ARRAYAGG(PetName LIMIT 3 OFFSET 2) |+-------------------------------------------------- -+| ["Scratch","Wag","Tweet"] |+------------------------------------------------- ------+
Alternativamente, podemos omitir oLIMIT
eOFFSET
palavras-chave e alterne os números (e separe-os com uma vírgula) para obter o mesmo resultado:
SELECT JSON_ARRAYAGG(PetName LIMIT 2, 3) FROM Pets;
Resultado:
+-----------------------------------+| JSON_ARRAYAGG(PetName LIMIT 2, 3) |+-----------------------------------+| ["Scratch","Wag","Tweet"] |+------------------------------------------------- +Resultados agrupados
Podemos usar o SQLGROUP BY
cláusula para produzir matrizes com base em um agrupamento de outra coluna.
Suponha que adicionamos uma coluna à nossa consulta original:
SELECT PetTypeId, PetName FROM Pets;
Resultado:
+-----------+---------+| PetTypeId | PetName |+-----------+---------+| 2 | Fofo || 3 | Buscar || 2 | Raspe || 3 | Wag || 1 | Tweet || 3 | Fofo || 3 | Casca || 2 | Miau |+-----------+---------+
Agora temos umPetTypeId
coluna, bem como oPetName
coluna. Isso corresponde a um tipo de animal de estimação para cada nome.
Aqui está um exemplo de uso doGROUP BY
cláusula para agrupar nossos resultados peloPetTypeId
coluna ao usar oJSON_ARRAYAGG()
função:
SELECT PetTypeId, JSON_ARRAYAGG(PetName) FROM Pets GROUP BY PetTypeId;
Resultado:
+-----------+---------------------------------+ | PetTypeId | JSON_ARRAYAGG(PetName) |+-----------+-------------------------------- -+| 1 | ["Twittar"] || 2 | ["Fofo","Raspadinha","Miau"] || 3 | ["Buscar","Abanar","Fofo","Latir"] |+-----------+------------------- --------------+
Isso nos permitiu criar uma matriz separada para cada tipo de animal de estimação.
A consulta a seguir usa umINNER JOIN
em outra tabela para retornar o tipo de animal de estimação real, não apenas o ID.
SELECT pt.PetType, p.PetName FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId ORDER BY PetType;
Resultado:
+---------+---------+| PetType | PetName |+---------+---------+| Pássaro | Tweet || Gato | Raspe || Gato | Fofo || Gato | Miau || Cão | Wag || Cão | Buscar || Cão | Casca || Cão | Fofo |+---------+---------+
Podemos ver que cada tipo de animal de estimação está listado na primeira coluna e o nome do animal de estimação está listado na segunda coluna.
Agora vamos usar oJSON_ARRAYAGG()
função:
SELECT pt.PetType, JSON_ARRAYAGG(p.PetName) FROM Pets p INNER JOIN PetTypes pt ON pt.PetTypeId = p.PetTypeId GROUP BY pt.PetType;
Resultado:
+---------+--------------------------+| PetType | JSON_ARRAYAGG(p.PetName) |+---------+--------------------------+| Pássaro | Tweet || Gato | Arranhão, Fofo, Miau || Cão | Sacudir,Pegar,Latir,Fofo |+--------+--------------------------+