MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

MariaDB JSON_ARRAYAGG() explicado


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 o LIMIT 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 o LIMIT e OFFSET 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 SQL GROUP 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 um PetTypeId coluna, bem como o PetName coluna. Isso corresponde a um tipo de animal de estimação para cada nome.

Aqui está um exemplo de uso do GROUP BY cláusula para agrupar nossos resultados pelo PetTypeId coluna ao usar o JSON_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 um INNER 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 o JSON_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 |+--------+--------------------------+