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'