Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

JSON_OBJECTAGG() – Crie um objeto JSON a partir dos resultados da consulta no MySQL


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.