O MySQL inclui uma função agregada chamada
JSON_OBJECTAGG()
. Essa função permite que você crie um objeto JSON contendo pares de valores-chave. Mais especificamente, ele permite que você crie esse objeto JSON com base nos resultados de uma consulta. Ele aceita dois argumentos, sendo o primeiro usado como chave e o segundo como valor. Esses argumentos podem ser nomes de colunas ou expressões.
Sintaxe
A sintaxe fica assim:
JSON_OBJECTAGG(key, value)
Onde
key
é a coluna ou expressão que representa a chave do par chave/valor e value
é a coluna ou expressão que representa o valor do par chave/valor. Exemplo
Aqui está um exemplo para demonstrar.
Aqui está uma consulta comum que podemos executar sem o
JSON_OBJECTAGG()
função:SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Resultado:
+-----------------+---------------+------------+ | State | City | Population | +-----------------+---------------+------------+ | Capital Region | Canberra | 322723 | | New South Wales | Sydney | 3276207 | | New South Wales | Newcastle | 270324 | | New South Wales | Central Coast | 227657 | | New South Wales | Wollongong | 219761 | | Queensland | Brisbane | 1291117 | | Queensland | Gold Coast | 311932 | | Queensland | Townsville | 109914 | | Queensland | Cairns | 92273 | | South Australia | Adelaide | 978100 | | Tasmania | Hobart | 126118 | | Victoria | Melbourne | 2865329 | | Victoria | Geelong | 125382 | | West Australia | Perth | 1096829 | +-----------------+---------------+------------+
Podemos ajustar essa consulta, para que o
Name
coluna (neste exemplo, demos a esta coluna um alias de City
) torna-se uma chave, e a Population
coluna se torna um valor. 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_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Resultado:
+-----------------+-----------------------------------------------------------------------------------------+ | State | City/Population | +-----------------+-----------------------------------------------------------------------------------------+ | Capital Region | {"Canberra": 322723} | | New South Wales | {"Sydney": 3276207, "Newcastle": 270324, "Wollongong": 219761, "Central Coast": 227657} | | Queensland | {"Cairns": 92273, "Brisbane": 1291117, "Gold Coast": 311932, "Townsville": 109914} | | South Australia | {"Adelaide": 978100} | | Tasmania | {"Hobart": 126118} | | Victoria | {"Geelong": 125382, "Melbourne": 2865329} | | West Australia | {"Perth": 1096829} | +-----------------+-----------------------------------------------------------------------------------------+
Neste caso, agrupamos as cidades por estado/distrito. No entanto, se quisermos apenas um grande objeto JSON contendo todas as cidades/populações desse país, podemos remover o estado/distrito (e seu
GROUP BY
associado cláusula) da consulta completamente. SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Resultado:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | City/Population | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | {"Perth": 1096829, "Cairns": 92273, "Hobart": 126118, "Sydney": 3276207, "Geelong": 125382, "Adelaide": 978100, "Brisbane": 1291117, "Canberra": 322723, "Melbourne": 2865329, "Newcastle": 270324, "Gold Coast": 311932, "Townsville": 109914, "Wollongong": 219761, "Central Coast": 227657} | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Veja também o
JSON_ARRAYAGG()
função que permite agregar os resultados da consulta em uma matriz JSON.