В MariaDB, JSON_CONTAINS()
е вградена функция, която ви позволява да разберете дали определена стойност е намерена в дадения JSON документ или на определен път в документа.
Връща 1
ако съдържа стойността, 0
ако не е така, и NULL
ако някой от аргументите е NULL
.
Синтаксис
Синтаксисът е така:
JSON_CONTAINS(json_doc, val[, path])
Където json_doc
е JSON документът, val
е стойността за намиране и path
незадължителна стойност, която определя път в документа.
Пример
Ето пример за демонстрация.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');
Резултат:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Wag"}') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
В този случай имаше съвпадение и резултатът е 1
.
В следващия пример няма съвпадение:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');
Резултат:
+---------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Woof"}') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+
Имайте предвид, че стойността е затворена в къдрави скоби.
Ето какво се случва, когато вторият аргумент не е валиден:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag');
Резултат:
+--------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Нека видим предупреждението:
SHOW WARNINGS;
Резултат:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Посочете път
По избор можете да използвате трети аргумент, за да посочите път.
Пример:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight');
Резултат:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
Когато посочвах път, не трябваше да използвам къдрави скоби.
Ето един, който търси низ:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');
Резултат:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
Забележете, че използвах двойни кавички в единичните кавички. Ако пропусна двойните кавички, ето какво се случва:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name');
Резултат:
+------------------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag', '$.name') | +------------------------------------------------+ | NULL | +------------------------------------------------+ 1 row in set, 1 warning (0.000 sec)
И нека проверим предупреждението:
SHOW WARNINGS;
Резултат:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Вложени структури
Ето пример, който търси стойност във вложен документ:
SET @json_document = '{ "name": "Wag", "specs": { "weight": 10, "height": 30 } }';
SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height');
Резултат:
+-----------------------------------------------------+ | JSON_CONTAINS(@json_document, 30, '$.specs.height') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Нулеви аргументи
Ако някой от аргументите е NULL
, резултатът е 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;
Резултат:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Неправилен брой параметри
Предоставянето на без аргументи води до грешка:
SELECT JSON_CONTAINS();
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
Същото е, когато предоставите твърде много аргументи:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);
Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'