Entre as muitas funções agregadas do MySQL está uma chamada
JSON_ARRAYAGG()
. Essa função permite agregar um conjunto de resultados como uma única matriz JSON. Cada linha do conjunto de resultados termina como um único elemento na matriz. A ordem dos elementos na matriz é indefinida.
Sintaxe
A sintaxe fica assim:
JSON_ARRAYAGG(col_or_expr)
Onde
col_or_expr
é uma coluna ou uma expressão que resulta em um único valor. Exemplo
Aqui está um exemplo para demonstrar.
Aqui está uma consulta comum que podemos executar sem o
JSON_ARRAYAGG()
função:SELECT District AS 'State', Name AS 'City' FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Resultado:
+-----------------+---------------+ | State | City | +-----------------+---------------+ | Capital Region | Canberra | | New South Wales | Sydney | | New South Wales | Newcastle | | New South Wales | Central Coast | | New South Wales | Wollongong | | Queensland | Brisbane | | Queensland | Gold Coast | | Queensland | Townsville | | Queensland | Cairns | | South Australia | Adelaide | | Tasmania | Hobart | | Victoria | Melbourne | | Victoria | Geelong | | West Australia | Perth | +-----------------+---------------+
Podemos ajustar essa consulta, para que cada cidade se torne um elemento em uma matriz. Para fazer isso, simplesmente passamos o
Name
coluna (o nome da cidade) para o JSON_ARRAYAGG()
função. Também usamos um
GROUP BY
cláusula para agrupar os resultados pelo District
coluna (neste caso, criamos um alias para esta coluna chamado State
). SELECT District AS 'State', JSON_ARRAYAGG(Name) AS 'Cities' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Resultado:
+-----------------+--------------------------------------------------------+ | State | Cities | +-----------------+--------------------------------------------------------+ | Capital Region | ["Canberra"] | | New South Wales | ["Sydney", "Newcastle", "Central Coast", "Wollongong"] | | Queensland | ["Brisbane", "Gold Coast", "Townsville", "Cairns"] | | South Australia | ["Adelaide"] | | Tasmania | ["Hobart"] | | Victoria | ["Melbourne", "Geelong"] | | West Australia | ["Perth"] | +-----------------+--------------------------------------------------------+
Veja também o
JSON_OBJECTAGG()
função que permite criar um objeto JSON a partir de uma consulta.