sql >> Databasteknik >  >> RDS >> Mysql

JSON_OBJECTAGG() – Skapa ett JSON-objekt från frågeresultat i MySQL

MySQL inkluderar en aggregatfunktion som heter JSON_OBJECTAGG() . Med den här funktionen kan du skapa ett JSON-objekt som innehåller nyckel-värdepar. Mer specifikt låter den dig skapa detta JSON-objekt baserat på resultaten av en fråga.

Den accepterar två argument, det första av dessa används som en nyckel och det andra som ett värde. Dessa argument kan vara kolumnnamn eller uttryck.

Syntax

Syntaxen ser ut så här:

JSON_OBJECTAGG(key, value)

Där key är kolumnen eller uttrycket som representerar nyckeln av nyckel/värdeparet och value är kolumnen eller uttrycket som representerar värdet av nyckel/värdeparet.

Exempel

Här är ett exempel att visa.

Här är en vanlig fråga som vi kan köra utan 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 justera den frågan så att Name kolumn (i det här exemplet har vi gett den här kolumnen ett alias för City ) blir en nyckel, och Population kolumnen blir ett värde.

Vi använder också en GROUP BY sats för att gruppera resultaten efter District kolumn (i det här fallet har vi skapat ett alias för denna kolumn som heter 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 det här fallet grupperade vi städerna efter deras stat/distrikt. Men om vi bara vill ha ett stort JSON-objekt som innehåller alla städer/populationer för det landet, kan vi ta bort staten/distriktet (och dess associerade GROUP BY klausul) från frågan helt och hållet.

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 även JSON_ARRAYAGG() funktion som låter dig aggregera dina frågeresultat till en JSON-array.


  1. De bästa sätten att använda SQL DELETE-satsen i en SQL-tabell

  2. Hur man konverterar PostgreSQL 9.4:s jsonb-typ till flytande

  3. MariaDB JSON_VALID() Förklarad

  4. SQL Data Definition Language