V MariaDB, JSON_CONTAINS()
je vestavěná funkce, která umožňuje zjistit, zda je zadaná hodnota nalezena v daném JSON dokumentu, nebo na konkrétní cestě v dokumentu.
Vrací 1
pokud obsahuje hodnotu, 0
pokud tomu tak není, a NULL
pokud je některý z argumentů NULL
.
Syntaxe
Syntaxe vypadá takto:
JSON_CONTAINS(json_doc, val[, path])
Kde json_doc
je dokument JSON, val
je hodnota k nalezení a path
volitelná hodnota, která určuje cestu v dokumentu.
Příklad
Zde je příklad k demonstraci.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');
Výsledek:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Wag"}') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
V tomto případě došlo ke shodě a výsledek je 1
.
V dalším příkladu není žádná shoda:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');
Výsledek:
+---------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Woof"}') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+
Všimněte si, že hodnota je uzavřena ve složených závorkách.
Co se stane, když druhý argument není platný:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag');
Výsledek:
+--------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Podívejme se na varování:
SHOW WARNINGS;
Výsledek:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Zadejte cestu
K zadání cesty můžete volitelně použít třetí argument.
Příklad:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight');
Výsledek:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
Při zadávání cesty jsem nemusel používat složené závorky.
Zde je jeden, který hledá řetězec:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');
Výsledek:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
Všimněte si, že jsem uvnitř jednoduchých uvozovek použil dvojité uvozovky. Pokud vynechám dvojité uvozovky, stane se toto:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name');
Výsledek:
+------------------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag', '$.name') | +------------------------------------------------+ | NULL | +------------------------------------------------+ 1 row in set, 1 warning (0.000 sec)
A podívejme se na varování:
SHOW WARNINGS;
Výsledek:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Vnořené struktury
Zde je příklad, který hledá hodnotu ve vnořeném dokumentu:
SET @json_document = '{ "name": "Wag", "specs": { "weight": 10, "height": 30 } }';
SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height');
Výsledek:
+-----------------------------------------------------+ | JSON_CONTAINS(@json_document, 30, '$.specs.height') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Nulové argumenty
Pokud je některý z argumentů NULL
, výsledkem je 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;
Výsledek:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Nesprávný počet parametrů
Pokud neposkytnete žádné argumenty, dojde k chybě:
SELECT JSON_CONTAINS();
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
Je to stejné, když uvedete příliš mnoho argumentů:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);
Výsledek:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'