W MariaDB, JSON_REMOVE()
to wbudowana funkcja, która usuwa dane z dokumentu JSON i zwraca wynik.
Składnia
Składnia wygląda tak:
JSON_REMOVE(json_doc, path[, path] ...)
Przykład
Oto przykład do zademonstrowania.
SET @json = '{ "name" : "Wag", "type" : "Dog" }';
SELECT JSON_REMOVE(@json, '$.type');
Wynik:
+------------------------------+ | JSON_REMOVE(@json, '$.type') | +------------------------------+ | {"name": "Wag"} | +------------------------------+
W tym przypadku usunęliśmy element danych type
z dokumentu. Innymi słowy, type
klucz i jego wartość zostały usunięte.
Tablice
JSON_REMOVE()
może być użyty do usunięcia całej tablicy lub określonych elementów w tablicy.
Aby usunąć całą tablicę, po prostu użyj nazwy klucza:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores');
Wynik:
+--------------------------------+ | JSON_REMOVE(@json, '$.scores') | +--------------------------------+ | {"name": "Wag"} | +--------------------------------+
To usunęło całą tablicę z dokumentu.
Aby usunąć element tablicy, określ indeks elementu. Oto przykład usuwania elementu tablicy z tablicy:
SET @json = '{ "name" : "Wag", "scores" : [8, 7, 9] }';
SELECT JSON_REMOVE(@json, '$.scores[1]');
Wynik:
+-----------------------------------+ | JSON_REMOVE(@json, '$.scores[1]') | +-----------------------------------+ | {"name": "Wag", "scores": [8, 9]} | +-----------------------------------+
W tym przypadku drugi element tablicy został usunięty. Tablice są oparte na zerach, więc $.scores[1]
odnosi się do drugiego elementu w tablicy.
Zobacz poniżej, jak JSON_REMOVE()
zajmuje się usuwaniem wielu ścieżek w tablicy.
Wiele ścieżek
Gdy podajesz wiele ścieżek, są one oceniane od lewej do prawej. Oznacza to, że wynik z wcześniejszej oceny jest używany jako wartość dla następnej.
Warto zwrócić na to szczególną uwagę podczas usuwania elementów z tablicy na podstawie ich indeksu.
Po pierwsze, oto przykład, który usuwa wiele ścieżek z dokumentu na podstawie ich klucza:
SET @json = '
{
"name" : "Wag",
"type" : "Dog",
"weight" : 10
}
';
SELECT JSON_REMOVE(@json, '$.type', '$.weight');
Wynik:
+------------------------------------------+ | JSON_REMOVE(@json, '$.type', '$.weight') | +------------------------------------------+ | {"name": "Wag"} | +------------------------------------------+
Każda para klucz/wartość została usunięta zgodnie z oczekiwaniami.
W następnym przykładzie nie usuwamy pary klucz/wartość. Zamiast tego usuwamy wiele elementów z tablicy:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[2]', '$.scores[4]') AS a,
JSON_REMOVE(@json, '$.scores[4]', '$.scores[2]') AS b;
Wynik:
+--------------------------+--------------------------+ | a | b | +--------------------------+--------------------------+ | {"scores": [0, 1, 3, 4]} | {"scores": [0, 1, 3, 5]} | +--------------------------+--------------------------+
W tym przypadku wywołaliśmy JSON_REMOVE()
dwa razy. Oba określają ten sam indeks tablicy do usunięcia (2
i 4
), ale zamieniamy argumenty w drugim wywołaniu. W pierwszym przykładzie jest to 2
następnie 4
(w tej kolejności). W drugim przykładzie jest to 4
następnie 2
.
Dało to inny wynik dla każdego połączenia. Jak wspomniano, wiele ścieżek jest ocenianych od lewej do prawej, więc kolejność może wpływać na wynik.
Oto kolejny przykład ilustrujący, w jaki sposób wynik może być zupełnie inny, w zależności od tego, ile ścieżek jest określonych, które z nich i w jakiej kolejności:
SET @json = '{ "scores" : [ 0, 1, 2, 3, 4, 5 ] }';
SELECT
JSON_REMOVE(@json, '$.scores[0]', '$.scores[1]', '$.scores[5]') AS a,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[5]', '$.scores[0]') AS b,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[0]', '$.scores[1]') AS c,
JSON_REMOVE(@json, '$.scores[5]', '$.scores[1]', '$.scores[0]') AS d,
JSON_REMOVE(@json, '$.scores[1]', '$.scores[0]', '$.scores[5]') AS e,
JSON_REMOVE(@json, '$.scores[0]', '$.scores[5]', '$.scores[1]') AS f;
Wynik (przy użyciu wyjścia pionowego):
a: {"scores": [1, 3, 4, 5]} b: {"scores": [2, 3, 4, 5]} c: {"scores": [1, 3, 4]} d: {"scores": [2, 3, 4]} e: {"scores": [2, 3, 4, 5]} f: {"scores": [1, 3, 4, 5]}
Argumenty zerowe
Jeśli jakikolwiek argument ma wartość NULL
, wynik to NULL
:
SELECT
JSON_REMOVE(null, '$.a') AS a,
JSON_REMOVE('{"a":1}', null) AS b,
JSON_REMOVE(null, null) AS c;
Wynik:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Nieprawidłowa liczba parametrów
Wywołanie JSON_REMOVE()
bez argumentu powoduje błąd:
SELECT JSON_REMOVE();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'
Tak samo jest, gdy nie przekazano wystarczającej liczby argumentów:
SELECT JSON_REMOVE('{"a":1}');
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_REMOVE'