W MariaDB, JSON_CONTAINS_PATH()
to wbudowana funkcja, która wskazuje, czy dany dokument JSON zawiera dane w określonej ścieżce lub ścieżkach.
Zwraca 1
jeśli dokument zawiera dane w określonej ścieżce/ach, 0
jeśli nie, i NULL
jeśli którykolwiek z argumentów jest NULL
.
Składnia
Składnia wygląda tak:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Gdzie json_doc
jest dokumentem JSON i path
określa ścieżkę, dla której należy znaleźć dane. Można podać wiele ścieżek.
return_arg
argument określa, jak radzić sobie z wieloma ścieżkami. Może być one
lub all
.
one
– Funkcja zwraca1
jeśli w dokumencie JSON istnieje co najmniej jedna ścieżka.all
– Funkcja zwraca1
tylko jeśli wszystkie ścieżki istnieją w dokumencie JSON.
Przykład
Oto przykład do zademonstrowania.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');
Wynik:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.name') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
W tym przypadku ścieżka istnieje, a wynikiem jest 1
.
W następnym przykładzie ścieżka nie istnieje, a wynikiem jest 0
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');
Wynik:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.type') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+
Wiele ścieżek
Oto kilka przykładów wyszukiwania wielu ścieżek w dokumencie:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result;
Wynik:
+--------+ | Result | +--------+ | 1 | +--------+
W tym przykładzie szukaliśmy dwóch ścieżek. Jedna ścieżka istnieje, a druga nie. Ale mamy 1
w każdym razie (wynik pozytywny). Dzieje się tak, ponieważ użyliśmy one
jako drugi argument. one
określa, że otrzymamy 1
jeśli istnieje jakakolwiek ze ścieżek.
Oto, co się stanie, jeśli użyjemy all
jako drugi argument:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result;
Wynik:
+--------+ | Result | +--------+ | 0 | +--------+
Tym razem wynik to 0
, ponieważ nie wszystkie ścieżki istnieją w dokumencie JSON.
Jeśli zmienimy brakującą ścieżkę ($.type
) na taki, który istnieje, otrzymujemy inny wynik:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result;
Wynik:
+--------+ | Result | +--------+ | 1 | +--------+
Tablice
Oto przykład sprawdzający, czy dany indeks istnieje w tablicy:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[2]'
) AS Result;
Wynik:
+--------+ | Result | +--------+ | 1 | +--------+
A oto, co się stanie, jeśli zwiększymy indeks do nieistniejącego:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[3]'
) AS Result;
Wynik:
+--------+ | Result | +--------+ | 0 | +--------+
Struktury zagnieżdżone
Oto przykład, który szuka ścieżki w zagnieżdżonym dokumencie:
SET @json_document = '
{
"name": "Wag",
"specs": {
"weight": 10,
"height": 30
}
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.specs.height'
) AS Result;
Wynik:
+--------+ | Result | +--------+ | 1 | +--------+
Argumenty zerowe
Jeśli jakikolwiek argument ma wartość NULL
, wynik to NULL
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT
JSON_CONTAINS_PATH(null, 'one', '$.weight') AS a,
JSON_CONTAINS_PATH(@json_document, null, '$.weight') AS b,
JSON_CONTAINS_PATH(@json_document, 'one', null) AS c;
Wynik:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Nieprawidłowa liczba parametrów
Brak argumentów skutkuje błędem:
SELECT JSON_CONTAINS_PATH();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
To samo dzieje się, gdy nie przekazujesz wystarczającej liczby argumentów:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document);
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'