W MariaDB, JSON_INSERT() to wbudowana funkcja, która wstawia dane do dokumentu JSON i zwraca wynik.
Składnia
Składnia wygląda tak:
JSON_INSERT(json_doc, path, val[, path, val] ...)
Gdzie json_doc jest dokumentem JSON, path jest ścieżką, do której należy wstawić dane, a val jest wartością do wstawienia w tej ścieżce.
Przykład
Oto przykład do zademonstrowania.
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.type', "Dog"); Wynik:
+----------------------------------------------+
| JSON_INSERT(@json_document, '$.type', "Dog") |
+----------------------------------------------+
| {"name": "Wag", "type": "Dog"} |
+----------------------------------------------+
Tutaj wstawiłem "type": "Dog" do dokumentu.
W tym przypadku użyłem $.type jako ścieżka. Dlatego type to klucz i Dog jest wartością.
Kiedy ścieżka już istnieje
Przekazanie ścieżki, która już istnieje w dokumencie JSON, powoduje zwrócenie oryginalnego dokumentu w niezmienionej postaci.
Przykład:
SET @json_document = '
{
"name": "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark"); Wynik:
+-----------------------------------------------+
| JSON_INSERT(@json_document, '$.name', "Bark") |
+-----------------------------------------------+
| {"name": "Wag"} |
+-----------------------------------------------+ Wstawianie tablic
Oto przykład wstawiania tablicy do dokumentu JSON:
SET @json_document = '
{
"name" : "Wag"
}
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]'); Wynik:
+--------------------------------------------------------+
| JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') |
+--------------------------------------------------------+
| {"name": "Wag", "scores": "[ 8, 7, 9 ]"} |
+--------------------------------------------------------+ Dołączanie do tablic
Oto przykład użycia JSON_INSERT() aby dołączyć dane do tablicy:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog"); Wynik:
+--------------------------------------------------------------+
| JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog") |
+--------------------------------------------------------------+
| {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} |
+--------------------------------------------------------------+ Jednak chociaż w tym przykładzie zadziałało dobrze, łatwo mogło się nie powieść. Na przykład, jeśli spróbujemy wstawić wartość w innym miejscu w tablicy, to nie zadziała:
SET @json_document = '
{
"_id" : 1,
"awards" : [ "Top Dog", "Best Dog" ]
}
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog"); Wynik:
+-----------------------------------------------------------+
| JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") |
+-----------------------------------------------------------+
| {"_id": 1, "awards": ["Top Dog", "Best Dog"]} |
+-----------------------------------------------------------+
Aby wstawić wartości do tablicy, użyj JSON_ARRAY_INSERT() funkcja zamiast.
Ponadto, chociaż w powyższym przykładzie udało nam się dodać wartość do tablicy, prawdopodobnie lepiej będzie użyć JSON_ARRAY_APPEND() funkcji, ponieważ został zaprojektowany specjalnie do tego celu.
Obiekty zagnieżdżone
Oto przykład wstawiania wartości do obiektu zagnieżdżonego w innym obiekcie:
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'
); Wynik:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}} Precyzuj wynik
Możemy użyć JSON_DETAILED() funkcja ułatwiająca odczytanie wyniku:
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'
)
); Wynik:
{
"_id": 1,
"name": "Wag",
"details":
{
"type": "Dog",
"weight": 20,
"awards":
{
"Florida Dog Awards": "Top Dog",
"New York Marathon": "Fastest Dog",
"Sumo 2020": "Biggest Dog"
}
}
} Argumenty zerowe
Jeśli któryś z json_document lub path argumenty są NULL , wynik to NULL :
SELECT
JSON_INSERT(null, '$.type', 'Dog'),
JSON_INSERT('{"a":1}', null, 'Dog'); Wynik:
+------------------------------------+-------------------------------------+
| JSON_INSERT(null, '$.type', 'Dog') | JSON_INSERT('{"a":1}', null, 'Dog') |
+------------------------------------+-------------------------------------+
| NULL | NULL |
+------------------------------------+-------------------------------------+
Jeśli jednak value argument to NULL , klucz jest dodawany w określonej ścieżce z wartością null :
SELECT JSON_INSERT('{"a":1}', '$.type', null); Wynik:
+----------------------------------------+
| JSON_INSERT('{"a":1}', '$.type', null) |
+----------------------------------------+
| {"a": 1, "type": null} |
+----------------------------------------+ Nieprawidłowa liczba parametrów
Brak argumentów skutkuje błędem:
SELECT JSON_INSERT(); Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Tak samo jest, gdy podasz za mało lub za dużo argumentów:
SELECT JSON_INSERT('{ "a": 1}'); Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_INSERT'
Podobne funkcje
JSON_REPLACE() funkcja może aktualizować istniejące dane.
JSON_SET() funkcja może aktualizować istniejące dane i wstawiać nowe dane. Więc JSON_SET() jest jak JSON_INSERT() i JSON_REPLACE() w jednej funkcji.