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)
Où 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.