I MariaDB, JSON_REPLACE()
är en inbyggd funktion som ersätter befintliga värden i ett JSON-dokument och returnerar resultatet.
Syntax
Syntaxen ser ut så här:
JSON_REPLACE(json_doc, path, val[, path, val] ...)
Exempel
Här är ett exempel att visa.
SET @json = '{ "name" : "Wag", "type" : "Cat" }';
SELECT JSON_REPLACE(@json, '$.type', 'Dog');
Resultat:
+--------------------------------------+ | JSON_REPLACE(@json, '$.type', 'Dog') | +--------------------------------------+ | {"name": "Wag", "type": "Dog"} | +--------------------------------------+
I det här fallet ersatte jag värdet Cat
med Dog
.
Arrayelement
För att ersätta ett matriselement, ange elementets index:
SET @json = '{ "name" : "Wag", "scores" : [8, 0, 9] }';
SELECT JSON_REPLACE(@json, '$.scores[1]', 7);
Resultat:
+---------------------------------------+ | JSON_REPLACE(@json, '$.scores[1]', 7) | +---------------------------------------+ | {"name": "Wag", "scores": [8, 7, 9]} | +---------------------------------------+
I det här fallet ersattes det andra matriselementet med det nya värdet. Arrayer är nollbaserade, och så $.scores[1]
hänvisar till det andra elementet i arrayen.
Flera vägar
Syntaxen gör det möjligt att ersätta värden på flera sökvägar med ett enda anrop till JSON_REPLACE()
.
När du tillhandahåller flera vägar utvärderas de från vänster till höger. Det betyder att resultatet från den tidigare utvärderingen används som värde för nästa.
Först, här är ett exempel som ersätter flera värden i ett dokument, baserat på deras nyckel:
SET @json = '
{
"name" : "Flutter",
"type" : "Bird",
"weight" : 10
}
';
SELECT JSON_REPLACE(@json, '$.type', 'Bat', '$.weight', 20);
Resultat:
+------------------------------------------------------+ | JSON_REPLACE(@json, '$.type', 'Bat', '$.weight', 20) | +------------------------------------------------------+ | {"name": "Flutter", "type": "Bat", "weight": 20} | +------------------------------------------------------+
Varje värde ersattes som förväntat.
I nästa exempel ersätter vi flera element i en array:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REPLACE(
@json,
'$.scores[2]', "a",
'$.scores[4]', "b"
) AS Result;
Resultat:
+------------------------------------+ | Result | +------------------------------------+ | {"scores": [0, 1, "a", 3, "b", 5]} | +------------------------------------+
Nollargument
Om json_doc
eller någon av path
argument är null
, resultatet är NULL
. Men om value
argumentet är null
, då ersätts värdet till null
.
SELECT
JSON_REPLACE(null, '$.a', 1) AS a,
JSON_REPLACE('{"a":1}', null, 1) AS b,
JSON_REPLACE('{"a":1}', '$.a', null) AS c;
Resultat:
+------+------+-------------+ | a | b | c | +------+------+-------------+ | NULL | NULL | {"a": null} | +------+------+-------------+
I följande exempel saknas ett av sökvägsargumenten i varje anrop till JSON_REPLACE()
. Detta resulterar i NULL
returneras för båda samtalen:
SET @json = '{ "name" : "Wag", "type" : "Cat" }';
SELECT
JSON_REPLACE(@json, null, 'Bark', '$.type', 'Dog') AS a,
JSON_REPLACE(@json, '$.name', 'Bark', null, 'Dog') AS b;
Resultat:
+------+------+ | a | b | +------+------+ | NULL | NULL | +------+------+
Felaktig parameterräkning
Anropar JSON_REPLACE()
utan argument resulterar i ett fel:
SELECT JSON_REPLACE();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
Det är samma sak när inte tillräckligt många argument skickas:
SELECT JSON_REPLACE('{"a":1}');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
Liknande funktioner
JSON_INSERT()
funktionen kan infoga nya data.
JSON_SET()
funktionen kan infoga nya data och uppdatera befintliga data. Alltså JSON_SET()
är som JSON_INSERT()
och JSON_REPLACE()
i en funktion.