sql >> Database >  >> RDS >> MariaDB

MariaDB JSON_REMOVE() uitgelegd

In MariaDB, JSON_REMOVE() is een ingebouwde functie die gegevens uit een JSON-document verwijdert en het resultaat retourneert.

Syntaxis

De syntaxis gaat als volgt:

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

Voorbeeld

Hier is een voorbeeld om te demonstreren.

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

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

Resultaat:

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

In dit geval hebben we het gegevenslid type verwijderd uit het document. Met andere woorden, het type sleutel en de bijbehorende waarde zijn verwijderd.

Arrays

JSON_REMOVE() kan worden gebruikt om de hele array of specifieke elementen binnen de array te verwijderen.

Om de hele array te verwijderen, gebruikt u gewoon de sleutelnaam:

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

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

Resultaat:

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

Dat verwijderde de hele array uit het document.

Om een ​​array-element te verwijderen, specificeert u de index van het element. Hier is een voorbeeld van het verwijderen van een array-element uit een array:

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

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

Resultaat:

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

In dit geval is het tweede array-element verwijderd. Arrays zijn gebaseerd op nul, en dus $.scores[1] verwijst naar het tweede element in de array.

Zie hieronder hoe JSON_REMOVE() behandelt het verwijderen van meerdere paden binnen de array.

Meerdere paden

Wanneer u meerdere paden opgeeft, worden ze van links naar rechts geëvalueerd. Dit betekent dat het resultaat van de eerdere evaluatie wordt gebruikt als waarde voor de volgende.

Het loont de moeite om hier speciaal op te letten bij het verwijderen van elementen uit een array op basis van hun index.

Ten eerste is hier een voorbeeld dat meerdere paden uit een document verwijdert, op basis van hun sleutel:

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

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

Resultaat:

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

Elk sleutel/waarde-paar is verwijderd zoals verwacht.

In het volgende voorbeeld verwijderen we het sleutel/waarde-paar niet. In plaats daarvan verwijderen we meerdere elementen uit een array:

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;

Resultaat:

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

In dit geval noemden we JSON_REMOVE() tweemaal. Beide specificeren dezelfde array-index om te verwijderen (2 en 4 ), maar we wisselen de argumenten om in de tweede aanroep. In het eerste voorbeeld wordt het 2 dan 4 (in die volgorde). In het tweede voorbeeld is het 4 dan 2 .

Dit leverde voor elk gesprek een ander resultaat op. Zoals vermeld, worden meerdere paden van links naar rechts geëvalueerd, en dus kan de volgorde het resultaat beïnvloeden.

Hier is nog een voorbeeld dat illustreert hoe het resultaat behoorlijk kan verschillen, afhankelijk van hoeveel paden zijn opgegeven, welke en in welke volgorde:

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;

Resultaat (met verticale uitvoer):

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

Nullargumenten

Als een argument NULL is , het resultaat is NULL :

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

Resultaat:

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

Onjuist aantal parameters

Aanroepen van JSON_REMOVE() zonder een argument resulteert in een fout:

SELECT JSON_REMOVE();

Resultaat:

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

Het is hetzelfde als er niet genoeg argumenten worden doorgegeven:

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

Resultaat:

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

  1. PostgreSQL Connection Pooling:Deel 2 – PgBouncer

  2. Werk meerdere tabelkolomwaarden bij met een enkele query

  3. Een beperking van een externe sleutel inschakelen in SQL Server (T-SQL-voorbeelden)

  4. pg -v 0.17.1 installeren