sql >> Databáze >  >> RDS >> Mysql

JSON_OBJECTAGG() – Vytvořte objekt JSON z výsledků dotazu v MySQL

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.


  1. Připojujete se k DB z rozšíření Chrome?

  2. Které jsou výkonnější, CTE nebo dočasné tabulky?

  3. Přehled různých uzlů pomocného plánu v PostgreSQL

  4. MySQL Trigger, který za určitých podmínek zabrání INSERT