W MariaDB JSON_CONTAINS()
to wbudowana funkcja, która pozwala dowiedzieć się, czy określona wartość znajduje się w danym dokumencie JSON, czy w określonej ścieżce w dokumencie.
Zwraca 1
jeśli zawiera wartość, 0
jeśli nie, i NULL
jeśli którykolwiek z argumentów jest NULL
.
Składnia
Składnia wygląda tak:
JSON_CONTAINS(json_doc, val[, path])
Gdzie json_doc
jest dokumentem JSON, val
to wartość do znalezienia, a path
opcjonalna wartość, która określa ścieżkę w dokumencie.
Przykład
Oto przykład do zademonstrowania.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');
Wynik:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Wag"}') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
W tym przypadku było dopasowanie, a wynik to 1
.
W następnym przykładzie brak dopasowania:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');
Wynik:
+---------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Woof"}') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+
Zauważ, że wartość jest ujęta w nawiasy klamrowe.
Oto, co się dzieje, gdy drugi argument jest nieprawidłowy:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag');
Wynik:
+--------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Zobaczmy ostrzeżenie:
SHOW WARNINGS;
Wynik:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Określ ścieżkę
Możesz opcjonalnie użyć trzeciego argumentu, aby określić ścieżkę.
Przykład:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight');
Wynik:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
Określając ścieżkę, nie musiałem używać nawiasów klamrowych.
Oto jedno wyszukiwanie ciągu:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');
Wynik:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
Zauważ, że użyłem podwójnych cudzysłowów wewnątrz pojedynczych cudzysłowów. Jeśli pominę podwójne cudzysłowy, oto co się stanie:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name');
Wynik:
+------------------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag', '$.name') | +------------------------------------------------+ | NULL | +------------------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Sprawdźmy ostrzeżenie:
SHOW WARNINGS;
Wynik:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Struktury zagnieżdżone
Oto przykład, który szuka wartości w zagnieżdżonym dokumencie:
SET @json_document = '{ "name": "Wag", "specs": { "weight": 10, "height": 30 } }';
SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height');
Wynik:
+-----------------------------------------------------+ | JSON_CONTAINS(@json_document, 30, '$.specs.height') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Argumenty zerowe
Jeśli którykolwiek z argumentów jest NULL
, wynik to NULL
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT
JSON_CONTAINS(null, 10, '$.weight') AS a,
JSON_CONTAINS(@json_document, null, '$.weight') AS b,
JSON_CONTAINS(@json_document, 10, null) AS c;
Wynik:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Nieprawidłowa liczba parametrów
Brak argumentów skutkuje błędem:
SELECT JSON_CONTAINS();
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
Tak samo jest, gdy podajesz zbyt wiele argumentów:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);
Wynik:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'