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.