I MariaDB, JSON_SET()
er en indbygget funktion, der opdaterer eller indsætter data i et JSON-dokument og returnerer resultatet.
JSON_SET()
kan opdatere og indsætte data, hvorimod JSON_INSERT()
kan kun indsætte data og JSON_REPLACE()
kan kun opdatere data.
Syntaks
Syntaksen ser sådan ud:
JSON_SET(json_doc, path, val[, path, val] ...)
Hvor:
json_doc
er JSON-dokumentet.path
er stien til det element, som der skal indsættes data for eller opdatere værdien ved.val
er den nye værdi.
Eksempel
Her er et eksempel til at demonstrere.
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT JSON_SET(@json, '$.type', 'Dog');
Resultat:
+----------------------------------+ | JSON_SET(@json, '$.type', 'Dog') | +----------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------+
I dette tilfælde opdaterede jeg værdien af type
medlem Cat
til Dog
.
Array-elementer
For at opdatere eller indsætte et array-element skal du angive elementets indeks:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[1]', 7);
Resultat:
+--------------------------------------+ | JSON_SET(@json, '$.scores[1]', 7) | +--------------------------------------+ | {"name": "Wag", "scores": [8, 7, 9]} | +--------------------------------------+
I dette tilfælde blev det andet array-element opdateret med den nye værdi. Arrays er nul-baserede, og derfor $.scores[1]
henviser til det andet element i arrayet.
Indsæt data
De tidligere eksempler opdaterede eksisterende data. Her er et eksempel på indsættelse af nye data:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}
';
SELECT JSON_SET(@json, '$.weight', 10);
Resultat:
+----------------------------------------------+ | JSON_SET(@json, '$.weight', 10) | +----------------------------------------------+ | {"name": "Wag", "type": "Dog", "weight": 10} | +----------------------------------------------+
Her indsatte vi et nyt nøgle/værdi-par ("weight": 10
).
Nedenfor er et eksempel på tilføjelse af et nyt element til en matrix:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[3]', 7);
Resultat:
+-----------------------------------------+ | JSON_SET(@json, '$.scores[3]', 7) | +-----------------------------------------+ | {"name": "Wag", "scores": [8, 0, 9, 7]} | +-----------------------------------------+
Dette array-eksempel kunne også udføres med JSON_ARRAY_INSERT()
eller JSON_ARRAY_APPEND()
.
Flere stier
Syntaksen giver mulighed for at indstille/opdatere værdier på flere stier med et enkelt kald til JSON_SET()
.
Eksempel:
SET @json = '
{
"name" : "Scratch",
"type" : "Rat"
}
';
SELECT JSON_SET(@json, '$.type', 'Cat', '$.weight', 10);
Resultat:
+--------------------------------------------------+ | JSON_SET(@json, '$.type', 'Cat', '$.weight', 10) | +--------------------------------------------------+ | {"name": "Scratch", "type": "Cat", "weight": 10} | +--------------------------------------------------+
I det næste eksempel indsætter vi en ny værdi i et array og opdaterer en anden:
SET @json = '{ "scores" : [ 0, 1, 2 ] }';
SELECT
JSON_SET(
@json,
'$.scores[1]', "a",
'$.scores[3]', "b"
) AS Result;
Resultat:
+------------------------------+ | Result | +------------------------------+ | {"scores": [0, "a", 2, "b"]} | +------------------------------+
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_SET(null, '$.a', 1) AS a,
JSON_SET('{"a":1}', null, 1) AS b,
JSON_SET('{"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_SET()
. I begge tilfælde er resultatet NULL
:
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT
JSON_SET(@json, null, 'Bark', '$.type', 'Dog') AS a,
JSON_SET(@json, '$.name', 'Bark', null, 'Dog') AS b;
Resultat:
+------+------+ | a | b | +------+------+ | NULL | NULL | +------+------+
Forkert parameterantal
Kalder JSON_SET()
uden et argument resulterer i en fejl:
SELECT JSON_SET();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'
Det er det samme, når der ikke sendes nok argumenter:
SELECT JSON_SET('{"a":1}');
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'