sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_OBJECTAGG() Förklarad

I MariaDB, JSON_OBJECTAGG() är en inbyggd funktion som returnerar ett JSON-objekt som innehåller nyckel-värdepar, baserat på dess två argument.

Syntax

Syntaxen ser ut så här:

JSON_OBJECTAGG(key, value)

Funktionen accepterar två uttryck som utvärderas till ett enda värde, eller två kolumnnamn, som argument. Det första argumentet är nyckeln och det andra är dess värde.

Exempel

Här är ett enkelt exempel att visa:

SELECT JSON_OBJECTAGG("name", "Homer");

Resultat:

+---------------------------------+
| JSON_OBJECTAGG("name", "Homer") |
+---------------------------------+
| {"name":"Homer"}                |
+---------------------------------+

Även om det här exemplet visar hur funktionen fungerar, kommer den verkliga fördelen in när man arbetar med kolumner eller andra uttryck.

Nedan finns exempel som använder databaskolumner för argumenten.

Ett databasexempel

Anta att vi frågar en tabell:

SELECT 
    PetName,
    DOB
FROM Pets;

Och få följande resultatuppsättning:

+---------+------------+
| PetName | DOB        |
+---------+------------+
| Fluffy  | 2020-11-20 |
| Fetch   | 2019-08-16 |
| Scratch | 2018-10-01 |
| Wag     | 2020-03-15 |
| Tweet   | 2020-11-28 |
| Fluffy  | 2020-09-17 |
| Bark    | NULL       |
| Meow    | NULL       |
+---------+------------+

Låt oss nu köra en fråga som skickar varje kolumn till JSON_OBJECTAGG() funktion, så att resultaten returneras som ett JSON-objekt:

SELECT JSON_OBJECTAGG(PetName, DOB)
FROM Pets
WHERE DOB < '2020-04-01';

Resultat:

+--------------------------------------------------------------------+
| JSON_OBJECTAGG(PetName, DOB)                                       |
+--------------------------------------------------------------------+
| {"Fetch":"2019-08-16", "Scratch":"2018-10-01", "Wag":"2020-03-15"} |
+--------------------------------------------------------------------+

Allt vi gjorde var att skicka kolumnnamnen till JSON_OBJECTAGG() fungera.

Vi använde också en WHERE klausul för att begränsa resultaten lite.

Grupperade resultat

Vi kan använda SQL GROUP BY sats för att producera JSON-objekt baserat på en gruppering av en annan kolumn.

Anta att vi lägger till en kolumn i vår ursprungliga fråga:

SELECT 
    PetTypeId,
    PetName,
    DOB
FROM Pets;

Resultat:

+-----------+---------+------------+
| PetTypeId | PetName | DOB        |
+-----------+---------+------------+
|         2 | Fluffy  | 2020-11-20 |
|         3 | Fetch   | 2019-08-16 |
|         2 | Scratch | 2018-10-01 |
|         3 | Wag     | 2020-03-15 |
|         1 | Tweet   | 2020-11-28 |
|         3 | Fluffy  | 2020-09-17 |
|         3 | Bark    | NULL       |
|         2 | Meow    | NULL       |
+-----------+---------+------------+

Nu har vi ett PetTypeId kolumnen samt PetName och DOB kolumner. Detta matchar en husdjurstyp till varje husdjur.

Här är ett exempel på hur du använder GROUP BY klausul för att gruppera våra resultat efter PetTypeId kolumnen medan du använder JSON_OBJECTAGG() funktion:

SELECT 
    PetTypeId,
    JSON_OBJECTAGG(PetName, DOB)
FROM Pets
GROUP BY PetTypeId;

Resultat:

+-----------+--------------------------------------------------------------------------------+
| PetTypeId | JSON_OBJECTAGG(PetName, DOB)                                                   |
+-----------+--------------------------------------------------------------------------------+
|         1 | {"Tweet":"2020-11-28"}                                                         |
|         2 | {"Fluffy":"2020-11-20", "Scratch":"2018-10-01", "Meow":null}                   |
|         3 | {"Fetch":"2019-08-16", "Wag":"2020-03-15", "Fluffy":"2020-09-17", "Bark":null} |
+-----------+--------------------------------------------------------------------------------+

Detta gjorde det möjligt för oss att skapa ett separat JSON-objekt för varje husdjurstyp.

Följande fråga använder en INNER JOIN på ett annat bord för att returnera den faktiska husdjurstypen, inte bara ID.

SELECT 
    pt.PetType,
    p.PetName,
    p.DOB
FROM Pets p 
INNER JOIN PetTypes pt 
ON pt.PetTypeId = p.PetTypeId
ORDER BY PetType;

Resultat:

+---------+---------+------------+
| PetType | PetName | DOB        |
+---------+---------+------------+
| Bird    | Tweet   | 2020-11-28 |
| Cat     | Scratch | 2018-10-01 |
| Cat     | Fluffy  | 2020-11-20 |
| Cat     | Meow    | NULL       |
| Dog     | Wag     | 2020-03-15 |
| Dog     | Fetch   | 2019-08-16 |
| Dog     | Bark    | NULL       |
| Dog     | Fluffy  | 2020-09-17 |
+---------+---------+------------+

Vi kan se att den faktiska husdjurstypen nu är listad i den första kolumnen, istället för bara husdjurstypens ID.

Låt oss nu använda JSON_OBJECTAGG() funktion:

SELECT 
    pt.PetType,
    JSON_OBJECTAGG(p.PetName, p.DOB)
FROM Pets p 
INNER JOIN PetTypes pt 
ON pt.PetTypeId = p.PetTypeId
GROUP BY pt.PetType;

Resultat:

+---------+--------------------------------------------------------------------------------+
| PetType | JSON_OBJECTAGG(p.PetName, p.DOB)                                               |
+---------+--------------------------------------------------------------------------------+
| Bird    | {"Tweet":"2020-11-28"}                                                         |
| Cat     | {"Scratch":"2018-10-01", "Fluffy":"2020-11-20", "Meow":null}                   |
| Dog     | {"Wag":"2020-03-15", "Fetch":"2019-08-16", "Bark":null, "Fluffy":"2020-09-17"} |
+---------+--------------------------------------------------------------------------------+

  1. Hur kan jag distribuera en .NET-applikation som använder ODAC utan att installera hela komponenten för användaren?

  2. Hur testar man en Oracle Stored Procedure med RefCursor returtyp?

  3. Master High Availability Manager (MHA) har kraschat! Vad gör jag nu?

  4. Sträng bokstaver och escape-tecken i postgresql