I MariaDB, JSON_REPLACE()
er en indbygget funktion, der erstatter eksisterende værdier i et JSON-dokument og returnerer resultatet.
Syntaks
Syntaksen ser sådan ud:
JSON_REPLACE(json_doc, path, val[, path, val] ...)
Eksempel
Her er et eksempel til at demonstrere.
SET @json = '{ "name" : "Wag", "type" : "Cat" }';
SELECT JSON_REPLACE(@json, '$.type', 'Dog');
Resultat:
+--------------------------------------+ | JSON_REPLACE(@json, '$.type', 'Dog') | +--------------------------------------+ | {"name": "Wag", "type": "Dog"} | +--------------------------------------+
I dette tilfælde erstattede jeg værdien Cat
med Dog
.
Array-elementer
For at erstatte et array-element skal du angive elementets indeks:
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 dette tilfælde blev det andet array-element erstattet med den nye værdi. Arrays er nul-baserede, og derfor $.scores[1]
henviser til det andet element i arrayet.
Flere stier
Syntaksen giver mulighed for at erstatte værdier på flere stier med et enkelt kald til JSON_REPLACE()
.
Når du angiver flere stier, evalueres de fra venstre mod højre. Det betyder, at resultatet fra den tidligere evaluering bruges som værdi for den næste.
For det første er her et eksempel, der erstatter flere værdier i et dokument, baseret på deres nøgle:
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} | +------------------------------------------------------+
Hver værdi blev erstattet som forventet.
I det næste eksempel erstatter vi flere elementer i et 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]} | +------------------------------------+
Nul-argumenter
Hvis json_doc
eller en hvilken som helst af path
argumenter er null
, resultatet er NULL
. Men hvis value
argumentet er null
, så erstattes værdien til 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 det følgende eksempel mangler et af sti-argumenterne fra hvert kald til JSON_REPLACE()
. Dette resulterer i NULL
returneres for begge opkald:
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 | +------+------+
Forkert parameterantal
Kalder JSON_REPLACE()
uden et argument resulterer i en fejl:
SELECT JSON_REPLACE();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
Det er det samme, når der ikke sendes nok argumenter:
SELECT JSON_REPLACE('{"a":1}');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REPLACE'
Lignende funktioner
JSON_INSERT()
funktion kan indsætte nye data.
JSON_SET()
funktion kan indsætte nye data og opdatere eksisterende data. Så JSON_SET()
er ligesom JSON_INSERT()
og JSON_REPLACE()
i én funktion.