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 oLIMITclá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 oLIMITeOFFSETpalavras-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 BYclá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 umPetTypeIdcoluna, bem como oPetNamecoluna. Isso corresponde a um tipo de animal de estimação para cada nome.
Aqui está um exemplo de uso doGROUP BYcláusula para agrupar nossos resultados peloPetTypeIdcoluna 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 JOINem 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 |+--------+--------------------------+