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 zwraca1jeśli w dokumencie JSON istnieje co najmniej jedna ścieżka.all– Funkcja zwraca1tylko 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'