sql >> Base de Datos >  >> RDS >> Mysql

JSON_OBJECTAGG():crea un objeto JSON a partir de los resultados de la consulta en MySQL

MySQL incluye una función agregada llamada JSON_OBJECTAGG() . Esta función le permite crear un objeto JSON que contiene pares clave-valor. Más específicamente, le permite crear este objeto JSON en función de los resultados de una consulta.

Acepta dos argumentos, el primero de estos se utiliza como clave y el segundo como valor. Estos argumentos pueden ser nombres de columna o expresiones.

Sintaxis

La sintaxis es así:

JSON_OBJECTAGG(key, value)

Donde key es la columna o expresión que representa la clave del par clave/valor, y value es la columna o expresión que representa el valor del par clave/valor.

Ejemplo

Aquí hay un ejemplo para demostrarlo.

Aquí hay una consulta común que podríamos ejecutar sin el JSON_OBJECTAGG() función:

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 esa consulta para que Name columna (en este ejemplo le hemos dado a esta columna un alias de City ) se convierte en una clave, y la Population columna se convierte en un valor.

También usamos un GROUP BY cláusula para agrupar los resultados por el District columna (en este caso, hemos creado un alias para esta columna llamado 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}                                                                      |
+-----------------+-----------------------------------------------------------------------------------------+

En este caso agrupamos las ciudades por su estado/distrito. Sin embargo, si solo queremos un objeto JSON grande que contenga todas las ciudades/poblaciones de ese país, podemos eliminar el estado/distrito (y su GROUP BY asociado cláusula) de la consulta por completo.

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} |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

También vea el JSON_ARRAYAGG() función que le permite agregar los resultados de su consulta en una matriz JSON.