MySQL obsahuje agregační funkci s názvem JSON_OBJECTAGG() . Tato funkce umožňuje vytvořit objekt JSON obsahující páry klíč–hodnota. Konkrétněji vám umožňuje vytvořit tento objekt JSON na základě výsledků dotazu.
Přijímá dva argumenty, z nichž první se používá jako klíč a druhý jako hodnota. Tyto argumenty mohou být názvy sloupců nebo výrazy.
Syntaxe
Syntaxe vypadá takto:
JSON_OBJECTAGG(key, value)
Kde key je sloupec nebo výraz, který představuje klíč páru klíč/hodnota a value je sloupec nebo výraz, který představuje hodnotu páru klíč/hodnota.
Příklad
Zde je příklad k demonstraci.
Zde je běžný dotaz, který můžeme spustit bez JSON_OBJECTAGG() funkce:
SELECT District AS 'State', Name AS 'City', Population FROM City WHERE CountryCode = 'AUS' ORDER BY State;
Výsledek:
+-----------------+---------------+------------+ | 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 | +-----------------+---------------+------------+
Tento dotaz můžeme upravit tak, aby Name (v tomto příkladu jsme tomuto sloupci přiřadili alias City ) se stane klíčem a Population sloupec se stane hodnotou.
Používáme také GROUP BY klauzule k seskupení výsledků podle District sloupec (v tomto případě jsme pro tento sloupec vytvořili alias s názvem State ).
SELECT District AS 'State', JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS' GROUP BY State;
Výsledek:
+-----------------+-----------------------------------------------------------------------------------------+
| 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} |
+-----------------+-----------------------------------------------------------------------------------------+
V tomto případě jsme seskupili města podle jejich státu/okresu. Pokud však chceme pouze jeden velký objekt JSON obsahující všechna města/populace pro danou zemi, můžeme odstranit stát/okres (a s ním spojené GROUP BY klauzule) z dotazu úplně.
SELECT JSON_OBJECTAGG(Name, Population) AS 'City/Population' FROM City WHERE CountryCode = 'AUS';
Výsledek:
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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} |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
Viz také JSON_ARRAYAGG() funkce, která vám umožní agregovat výsledky dotazu do pole JSON.