MySQL inkluderer en samlet funktion kaldet JSON_OBJECTAGG()
. Denne funktion giver dig mulighed for at oprette et JSON-objekt, der indeholder nøgle-værdi-par. Mere specifikt lader den dig oprette dette JSON-objekt baseret på resultaterne af en forespørgsel.
Den accepterer to argumenter, det første af disse bruges som en nøgle og det andet som en værdi. Disse argumenter kan være kolonnenavne eller udtryk.
Syntaks
Syntaksen ser sådan ud:
JSON_OBJECTAGG(key, value)
Hvor key
er den kolonne eller det udtryk, der repræsenterer nøglen af nøgle/værdi-parret og value
er den kolonne eller det udtryk, der repræsenterer værdien af nøgle/værdi-parret.
Eksempel
Her er et eksempel til at demonstrere.
Her er en almindelig forespørgsel, vi muligvis kører uden JSON_OBJECTAGG()
funktion:
SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Resultat:
+-----------------+---------------+------------+ | 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 | +-----------------+---------------+------------+
Vi kan justere den forespørgsel, så Name
kolonne (i dette eksempel har vi givet denne kolonne et alias for City
) bliver en nøgle, og Population
kolonne bliver en værdi.
Vi bruger også en GROUP BY
klausul for at gruppere resultaterne efter District
kolonne (i dette tilfælde har vi oprettet et alias for denne kolonne kaldet State
).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Resultat:
+-----------------+-----------------------------------------------------------------------------------------+ | 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} | +-----------------+-----------------------------------------------------------------------------------------+
I dette tilfælde grupperede vi byerne efter deres stat/distrikt. Men hvis vi bare vil have ét stort JSON-objekt, der indeholder alle byer/befolkninger for det pågældende land, kan vi fjerne staten/distriktet (og dets tilknyttede GROUP BY
klausul) fra forespørgslen helt.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Resultat:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | 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} | +------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Se også JSON_ARRAYAGG()
funktion, som giver dig mulighed for at samle dine forespørgselsresultater i et JSON-array.