Mysql
 sql >> Database >  >> RDS >> Mysql

JSON_OBJECTAGG() – Crea un oggetto JSON dai risultati della query in MySQL

MySQL include una funzione aggregata chiamata JSON_OBJECTAGG() . Questa funzione consente di creare un oggetto JSON contenente coppie chiave-valore. Più specificamente, ti consente di creare questo oggetto JSON in base ai risultati di una query.

Accetta due argomenti, il primo utilizzato come chiave e il secondo come valore. Questi argomenti possono essere nomi di colonna o espressioni.

Sintassi

La sintassi è questa:

JSON_OBJECTAGG(key, value)

Dove key è la colonna o l'espressione che rappresenta la chiave della coppia chiave/valore e value è la colonna o l'espressione che rappresenta il valore della coppia chiave/valore.

Esempio

Ecco un esempio da dimostrare.

Ecco una query comune che potremmo eseguire senza il JSON_OBJECTAGG() funzione:

SELECT 
  District AS 'State',
  Name AS 'City',
  Population
FROM City
WHERE CountryCode = 'AUS'
ORDER BY State;

Risultato:

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

Possiamo modificare quella query, in modo che il Name colonna (in questo esempio abbiamo assegnato a questa colonna un alias di City ) diventa una chiave e la Population colonna diventa un valore.

Usiamo anche un GROUP BY clausola per raggruppare i risultati per District colonna (in questo caso, abbiamo creato un alias per questa colonna chiamato State ).

SELECT 
  District AS 'State',
  JSON_OBJECTAGG(Name, Population) AS 'City/Population'
FROM City
WHERE CountryCode = 'AUS'
GROUP BY State;

Risultato:

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

In questo caso abbiamo raggruppato le città per stato/distretto. Tuttavia, se vogliamo solo un grande oggetto JSON contenente tutte le città/popolazioni per quel paese, possiamo rimuovere lo stato/distretto (e il suo GROUP BY associato clausola) dalla query del tutto.

SELECT
  JSON_OBJECTAGG(Name, Population) AS 'City/Population'
FROM City
WHERE CountryCode = 'AUS';

Risultato:

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

Vedi anche il JSON_ARRAYAGG() funzione che ti consente di aggregare i risultati della query in un array JSON.