sql >> Databáze >  >> RDS >> MariaDB

MariaDB JSON_OBJECTAGG() Vysvětleno

V MariaDB, JSON_OBJECTAGG() je vestavěná funkce, která vrací objekt JSON obsahující páry klíč–hodnota na základě svých dvou argumentů.

Syntaxe

Syntaxe vypadá takto:

JSON_OBJECTAGG(key, value)

Funkce přijímá jako argumenty dva výrazy, které se vyhodnotí jako jedna hodnota nebo názvy dvou sloupců. První argument je klíč a druhý je jeho hodnota.

Příklad

Zde je jednoduchý příklad k demonstraci:

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

Výsledek:

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

Ačkoli tento příklad demonstruje, jak funkce funguje, skutečný přínos přichází při práci se sloupci nebo jinými výrazy.

Níže jsou uvedeny příklady, které pro argumenty používají sloupce databáze.

Příklad databáze

Předpokládejme, že se dotazujeme na tabulku:

SELECT 
    PetName,
    DOB
FROM Pets;

A získejte následující sadu výsledků:

+---------+------------+
| 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       |
+---------+------------+

Nyní spustíme dotaz, který předá každý sloupec do JSON_OBJECTAGG() funkce, takže výsledky jsou vráceny jako objekt JSON:

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

Výsledek:

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

Vše, co jsme udělali, bylo předat názvy sloupců do JSON_OBJECTAGG() funkce.

Také jsme použili WHERE klauzule, abyste výsledky trochu zúžili.

Skupinové výsledky

Můžeme použít SQL GROUP BY klauzule k vytváření objektů JSON na základě seskupení jiného sloupce.

Předpokládejme, že do našeho původního dotazu přidáme sloupec:

SELECT 
    PetTypeId,
    PetName,
    DOB
FROM Pets;

Výsledek:

+-----------+---------+------------+
| 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       |
+-----------+---------+------------+

Nyní máme PetTypeId stejně jako PetName a DOB sloupců. To odpovídá typu zvířete pro každé zvíře.

Zde je příklad použití GROUP BY klauzule k seskupení našich výsledků podle PetTypeId při použití JSON_OBJECTAGG() funkce:

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

Výsledek:

+-----------+--------------------------------------------------------------------------------+
| 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} |
+-----------+--------------------------------------------------------------------------------+

To nám umožnilo vytvořit samostatný objekt JSON pro každý typ domácího mazlíčka.

Následující dotaz používá INNER JOIN na jiný stůl, abyste vrátili skutečný typ zvířete, nikoli pouze ID.

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

Výsledek:

+---------+---------+------------+
| 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 |
+---------+---------+------------+

Vidíme, že skutečný typ mazlíčka je nyní uveden v prvním sloupci, nikoli pouze ID typu zvířete.

Nyní použijeme JSON_OBJECTAGG() funkce:

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;

Výsledek:

+---------+--------------------------------------------------------------------------------+
| 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. Jak odečíst 30 dní od aktuálního data pomocí SQL Server

  2. Jak zkontrolovat, zda pole PostgreSQL obsahuje hodnotu

  3. Optimalizace vyhledávání MySQL pomocí podobných a zástupných znaků

  4. Příklady převodu ‚date‘ na ‚datetime2‘ v SQL Server (T-SQL)