Mysql
 sql >> Base de données >  >> RDS >> Mysql

JSON_OBJECTAGG() - Créer un objet JSON à partir des résultats de la requête dans MySQL

MySQL inclut une fonction d'agrégation appelée JSON_OBJECTAGG() . Cette fonction permet de créer un objet JSON contenant des paires clé-valeur. Plus précisément, il vous permet de créer cet objet JSON en fonction des résultats d'une requête.

Il accepte deux arguments, le premier étant utilisé comme clé et le second comme valeur. Ces arguments peuvent être des noms de colonne ou des expressions.

Syntaxe

La syntaxe ressemble à ceci :

JSON_OBJECTAGG(key, value)

key est la colonne ou l'expression qui représente la clé de la paire clé/valeur, et value est la colonne ou l'expression qui représente la valeur de la paire clé/valeur.

Exemple

Voici un exemple pour illustrer.

Voici une requête courante que nous pourrions exécuter sans le JSON_OBJECTAGG() fonction :

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

Résultat :

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

Nous pouvons ajuster cette requête, de sorte que le Name colonne (dans cet exemple, nous avons donné à cette colonne un alias de City ) devient une clé, et la Population colonne devient une valeur.

Nous utilisons également un GROUP BY clause pour regrouper les résultats par le District colonne (dans ce cas, nous avons créé un alias pour cette colonne appelé State ).

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

Résultat :

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

Dans ce cas, nous avons regroupé les villes par leur état/district. Cependant, si nous voulons juste un gros objet JSON contenant toutes les villes/populations de ce pays, nous pouvons supprimer l'état/district (et son GROUP BY associé clause) de la requête.

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

Résultat :

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

Voir aussi le JSON_ARRAYAGG() fonction qui vous permet d'agréger les résultats de votre requête dans un tableau JSON.