W MariaDB JSON_SET()
to wbudowana funkcja, która aktualizuje lub wstawia dane do dokumentu JSON i zwraca wynik.
JSON_SET()
może aktualizować i wstawiać dane, podczas gdy JSON_INSERT()
może tylko wstawiać dane, a JSON_REPLACE()
może tylko aktualizować dane.
Składnia
Składnia wygląda tak:
JSON_SET(json_doc, path, val[, path, val] ...)
Gdzie:
json_doc
jest dokumentem JSON.path
jest ścieżką elementu, dla którego należy wstawić dane lub zaktualizować wartość.val
to nowa wartość.
Przykład
Oto przykład do zademonstrowania.
SET @json = '
{
"name" : "Wag",
"type" : "Cat"
}
';
SELECT JSON_SET(@json, '$.type', 'Dog');
Wynik:
+----------------------------------+ | JSON_SET(@json, '$.type', 'Dog') | +----------------------------------+ | {"name": "Wag", "type": "Dog"} | +----------------------------------+
W tym przypadku zaktualizowałem wartość type
członek Cat
do Dog
.
Elementy tablicy
Aby zaktualizować lub wstawić element tablicy, określ indeks elementu:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[1]', 7);
Wynik:
+--------------------------------------+ | JSON_SET(@json, '$.scores[1]', 7) | +--------------------------------------+ | {"name": "Wag", "scores": [8, 7, 9]} | +--------------------------------------+
W tym przypadku drugi element tablicy został zaktualizowany nową wartością. Tablice są oparte na zerach, więc $.scores[1]
odnosi się do drugiego elementu w tablicy.
Wstaw dane
Poprzednie przykłady zaktualizowały istniejące dane. Oto przykład wstawiania nowych danych:
SET @json = '
{
"name" : "Wag",
"type" : "Dog"
}
';
SELECT JSON_SET(@json, '$.weight', 10);
Wynik:
+----------------------------------------------+ | JSON_SET(@json, '$.weight', 10) | +----------------------------------------------+ | {"name": "Wag", "type": "Dog", "weight": 10} | +----------------------------------------------+
Tutaj wstawiliśmy nową parę klucz/wartość ("weight": 10
).
Poniżej znajduje się przykład dodawania nowego elementu do tablicy:
SET @json = '
{
"name" : "Wag",
"scores" : [8, 0, 9]
}
';
SELECT JSON_SET(@json, '$.scores[3]', 7);
Wynik:
+-----------------------------------------+ | JSON_SET(@json, '$.scores[3]', 7) | +-----------------------------------------+ | {"name": "Wag", "scores": [8, 0, 9, 7]} | +-----------------------------------------+
Ten przykład tablicy można również wykonać za pomocą JSON_ARRAY_INSERT()
lub JSON_ARRAY_APPEND()
.
Wiele ścieżek
Składnia umożliwia ustawianie/aktualizowanie wartości w wielu ścieżkach za pomocą jednego wywołania JSON_SET()
.
Przykład:
SET @json = '
{
"name" : "Scratch",
"type" : "Rat"
}
';
SELECT JSON_SET(@json, '$.type', 'Cat', '$.weight', 10);
Wynik:
+--------------------------------------------------+ | JSON_SET(@json, '$.type', 'Cat', '$.weight', 10) | +--------------------------------------------------+ | {"name": "Scratch", "type": "Cat", "weight": 10} | +--------------------------------------------------+
W następnym przykładzie wstawiamy nową wartość do tablicy i aktualizujemy inną:
SET @json = '{ "scores" : [ 0, 1, 2 ] }';
SELECT
JSON_SET(
@json,
'$.scores[1]', "a",
'$.scores[3]', "b"
) AS Result;
Wynik:
+------------------------------+ | Result | +------------------------------+ | {"scores": [0, "a", 2, "b"]} | +------------------------------+
Argumenty zerowe
Jeśli json_doc
lub dowolna ze path
argumenty są null
, wynik to NULL
. Ale jeśli value
argument jest null
, wartość jest zastępowana 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;
Wynik:
+------+------+-------------+ | a | b | c | +------+------+-------------+ | NULL | NULL | {"a": null} | +------+------+-------------+
W poniższym przykładzie brakuje jednego z argumentów ścieżki w każdym wywołaniu JSON_SET()
. W obu przypadkach wynikiem jest 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;
Wynik:
+------+------+ | a | b | +------+------+ | NULL | NULL | +------+------+
Nieprawidłowa liczba parametrów
Wywołanie JSON_SET()
bez argumentu powoduje błąd:
SELECT JSON_SET();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'
Tak samo jest, gdy nie przekazano wystarczającej liczby argumentów:
SELECT JSON_SET('{"a":1}');
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_SET'