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'