MySQL bevat een verzamelfunctie met de naam JSON_OBJECTAGG()
. Met deze functie kunt u een JSON-object maken dat sleutel-waardeparen bevat. Meer specifiek kun je dit JSON-object maken op basis van de resultaten van een query.
Het accepteert twee argumenten, waarvan de eerste wordt gebruikt als een sleutel en de tweede als een waarde. Deze argumenten kunnen kolomnamen of uitdrukkingen zijn.
Syntaxis
De syntaxis gaat als volgt:
JSON_OBJECTAGG(key, value)
Waar key
is de kolom of uitdrukking die de sleutel vertegenwoordigt van het sleutel/waarde-paar en value
is de kolom of uitdrukking die de waarde vertegenwoordigt van het sleutel/waarde-paar.
Voorbeeld
Hier is een voorbeeld om te demonstreren.
Hier is een veelvoorkomende zoekopdracht die we zonder kunnen uitvoeren de JSON_OBJECTAGG()
functie:
SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Resultaat:
+-----------------+---------------+------------+ | 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 | +-----------------+---------------+------------+
We kunnen die zoekopdracht aanpassen, zodat de Name
kolom (in dit voorbeeld hebben we deze kolom een alias gegeven van City
) wordt een sleutel, en de Population
kolom wordt een waarde.
We gebruiken ook een GROUP BY
clausule om de resultaten te groeperen op de District
kolom (in dit geval hebben we een alias voor deze kolom gemaakt met de naam State
).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Resultaat:
+-----------------+-----------------------------------------------------------------------------------------+ | 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 dit geval hebben we de steden gegroepeerd op staat/district. Als we echter slechts één groot JSON-object willen dat alle steden/populaties voor dat land bevat, kunnen we de staat/het district (en de bijbehorende GROUP BY
verwijderen) clausule) helemaal uit de query.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Resultaat:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 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} | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Zie ook de JSON_ARRAYAGG()
functie waarmee u uw zoekopdrachtresultaten kunt samenvoegen tot een JSON-array.