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

MariaDB JSON_REMOVE() Vysvětleno

V MariaDB, JSON_REMOVE() je vestavěná funkce, která odstraňuje data z dokumentu JSON a vrací výsledek.

Syntaxe

Syntaxe vypadá takto:

JSON_REMOVE(json_doc, path[, path] ...)

Příklad

Zde je příklad k demonstraci.

SET @json = '{ "name" : "Wag", "type" : "Dog" }';

SELECT JSON_REMOVE(@json, '$.type');

Výsledek:

+------------------------------+
| JSON_REMOVE(@json, '$.type') |
+------------------------------+
| {"name": "Wag"}              |
+------------------------------+

V tomto případě jsme odstranili datový člen type z dokumentu. Jinými slovy, type klíč a jeho přidružená hodnota byly odstraněny.

Pole

JSON_REMOVE() lze použít k odstranění celého pole nebo určitých prvků v poli.

Chcete-li odstranit celé pole, jednoduše použijte název klíče:

SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';

SELECT JSON_REMOVE(@json, '$.scores');

Výsledek:

+--------------------------------+
| JSON_REMOVE(@json, '$.scores') |
+--------------------------------+
| {"name": "Wag"}                |
+--------------------------------+

Tím bylo z dokumentu odstraněno celé pole.

Chcete-li odstranit prvek pole, zadejte index prvku. Zde je příklad odstranění prvku pole z pole:

SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';

SELECT JSON_REMOVE(@json, '$.scores[1]');

Výsledek:

+-----------------------------------+
| JSON_REMOVE(@json, '$.scores[1]') |
+-----------------------------------+
| {"name": "Wag", "scores": [8, 9]} |
+-----------------------------------+

V tomto případě byl odstraněn druhý prvek pole. Pole jsou založeny na nule, takže $.scores[1] odkazuje na druhý prvek v poli.

Níže se dozvíte, jak JSON_REMOVE() se zabývá odstraněním více cest v rámci pole.

Více cest

Při poskytování více cest se vyhodnocují zleva doprava. To znamená, že výsledek z dřívějšího vyhodnocení se použije jako hodnota pro další.

Vyplatí se to mít na paměti zejména při odstraňování prvků z pole na základě jejich indexu.

Nejprve je zde příklad, který odstraní více cest z dokumentu na základě jejich klíče:

SET @json = '
    { 
        "name" : "Wag", 
        "type" : "Dog",
        "weight" : 10
    }
';

SELECT JSON_REMOVE(@json, '$.type', '$.weight');

Výsledek:

+------------------------------------------+
| JSON_REMOVE(@json, '$.type', '$.weight') |
+------------------------------------------+
| {"name": "Wag"}                          |
+------------------------------------------+

Každý pár klíč/hodnota byl podle očekávání odstraněn.

V dalším příkladu neodstraňujeme pár klíč/hodnota. Místo toho z pole odstraníme několik prvků:

SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';

SELECT 
    JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
    JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;

Výsledek:

+--------------------------+--------------------------+
| a                        | b                        |
+--------------------------+--------------------------+
| {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} |
+--------------------------+--------------------------+

V tomto případě jsme zavolali JSON_REMOVE() dvakrát. Oba určují stejný index pole, který se má odstranit (2 a 4 ), ale ve druhém volání prohodíme argumenty. V prvním příkladu je to 2 pak 4 (v tomto pořadí). Ve druhém příkladu je to 4 pak 2 .

To přineslo jiný výsledek pro každé volání. Jak již bylo zmíněno, více cest se vyhodnocuje zleva doprava, takže pořadí může ovlivnit výsledek.

Zde je další příklad, který ilustruje, jak může být výsledek zcela odlišný v závislosti na tom, kolik cest je specifikováno, které z nich a v jakém pořadí:

SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';

SELECT 
    JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
    JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
    JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
    JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
    JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
    JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;

Výsledek (při použití vertikálního výstupu):

a: {"scores": [1, 3, 4, 5]}
b: {"scores": [2, 3, 4, 5]}
c: {"scores": [1, 3, 4]}
d: {"scores": [2, 3, 4]}
e: {"scores": [2, 3, 4, 5]}
f: {"scores": [1, 3, 4, 5]}

Nulové argumenty

Pokud je některý argument NULL , výsledkem je NULL :

SELECT 
    JSON_REMOVE(null, '$.a') AS a,
    JSON_REMOVE('{"a":1}', null) AS b,
    JSON_REMOVE(null, null) AS c;

Výsledek:

+------+------+------+
| a    | b    | c    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Nesprávný počet parametrů

Volání JSON_REMOVE() bez argumentu vede k chybě:

SELECT JSON_REMOVE();

Výsledek:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'

Je to stejné, když není předán dostatek argumentů:

SELECT JSON_REMOVE('{"a":1}');

Výsledek:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'

  1. Jak vytvořit vztah v MySQL Workbench

  2. Cena za nečištění

  3. Jak funguje SQLite Length()

  4. SQLite COUNT