V MariaDB, JSON_INSERT()
je vestavěná funkce, která vkládá data do dokumentu JSON a vrací výsledek.
Syntaxe
Syntaxe vypadá takto:
JSON_INSERT(json_doc, path, val[, path, val] ...)
Kde json_doc
je dokument JSON, path
je cesta, kam mají být data vložena, a val
je hodnota, která má být vložena do této cesty.
Příklad
Zde je příklad k demonstraci.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog");
Výsledek:
+----------------------------------------------+ | JSON_INSERT(@json_document, '$.type', "Dog") | +----------------------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------------------+
Zde jsem vložil "type": "Dog"
do dokumentu.
V tomto případě jsem použil $.type
jako cesta. Proto type
je klíč a Dog
je hodnota.
Když cesta již existuje
Předání cesty, která již v dokumentu JSON existuje, způsobí, že původní dokument bude vrácen beze změny.
Příklad:
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark");
Výsledek:
+-----------------------------------------------+ | JSON_INSERT(@json_document, '$.name', "Bark") | +-----------------------------------------------+ | {"name": "Wag"} | +-----------------------------------------------+
Vkládání polí
Zde je příklad vložení pole do dokumentu JSON:
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]');
Výsledek:
+--------------------------------------------------------+ | JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') | +--------------------------------------------------------+ | {"name": "Wag", "scores": "[ 8, 7, 9 ]"} | +--------------------------------------------------------+
Připojování k polím
Zde je příklad použití JSON_INSERT()
pro připojení dat k poli:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog");
Výsledek:
+--------------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") | +--------------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} | +--------------------------------------------------------------+
Ačkoli to pro tento příklad fungovalo dobře, mohlo to snadno selhat. Pokud se například pokusíme vložit hodnotu na jiné místo v poli, nefunguje to:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog");
Výsledek:
+-----------------------------------------------------------+ | JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") | +-----------------------------------------------------------+ | {"_id": 1, "awards": ["Top Dog", "Best Dog"]} | +-----------------------------------------------------------+
Chcete-li vložit hodnoty do pole, použijte JSON_ARRAY_INSERT()
místo toho funkci.
Také, ačkoli jsme byli schopni připojit hodnotu k poli ve výše uvedeném příkladu, pravděpodobně bude lepší použít JSON_ARRAY_APPEND()
funkce, protože je navržen speciálně pro tento účel.
Vnořené objekty
Zde je příklad vložení hodnoty do objektu vnořeného do jiného objektu:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
);
Výsledek:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}}
Zkrášlení výsledku
Můžeme použít JSON_DETAILED()
funkce, která usnadní čtení výsledku:
SET @json_document = '
{
"_id" : 1,
"name" : "Wag",
"details" : {
"type" : "Dog",
"weight" : 20,
"awards" : {
"Florida Dog Awards" : "Top Dog",
"New York Marathon" : "Fastest Dog"
}
}
}
';
SELECT
JSON_DETAILED(
JSON_INSERT(
@json_document,
'$.details.awards.Sumo 2020',
'Biggest Dog'
)
);
Výsledek:
{ "_id": 1, "name": "Wag", "details": { "type": "Dog", "weight": 20, "awards": { "Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog" } } }
Nulové argumenty
Pokud některý z json_document
nebo path
argumenty jsou NULL
, výsledkem je NULL
:
SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog');
Výsledek:
+------------------------------------+-------------------------------------+ | JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') | +------------------------------------+-------------------------------------+ | NULL | NULL | +------------------------------------+-------------------------------------+
Pokud však value
argument je NULL
, klíč je přidán do zadané cesty s hodnotou null
:
SELECT JSON_INSERT('{"a":1}', '$.type', null);
Výsledek:
+----------------------------------------+ | JSON_INSERT('{"a":1}', '$.type', null) | +----------------------------------------+ | {"a": 1, "type": null} | +----------------------------------------+
Nesprávný počet parametrů
Pokud neposkytnete žádné argumenty, dojde k chybě:
SELECT JSON_INSERT();
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Je to stejné, když poskytnete příliš málo nebo příliš mnoho argumentů:
SELECT JSON_INSERT('{ "a": 1}');
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Podobné funkce
JSON_REPLACE()
funkce může aktualizovat existující data.
JSON_SET()
funkce může aktualizovat stávající data a vkládat nová data. Takže JSON_SET()
je jako JSON_INSERT()
a JSON_REPLACE()
v jedné funkci.