В MariaDB, JSON_CONTAINS_PATH() е вградена функция, която показва дали даден JSON документ съдържа данни по посочения път или пътеки.
Връща 1 ако документът съдържа данни в посочения/и път/и, 0 ако не е така, и NULL ако някой от аргументите е NULL .
Синтаксис
Синтаксисът е така:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Където json_doc е JSON документът и path определя пътя, по който да се намерят данни. Могат да бъдат предоставени множество пътища.
return_arg аргумент определя как да се работи с множество пътища. Може да бъде one или all .
one– Функцията връща1ако съществува поне един път в JSON документа.all– Функцията връща1само ако всички пътища съществуват в JSON документа.
Пример
Ето пример за демонстрация.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name'); Резултат:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.name') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
В този случай пътят съществува и резултатът е 1 .
В следващия пример пътят не съществува и резултатът е 0 :
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type'); Резултат:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.type') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+
Множество пътища
Ето няколко примера, които търсят множество пътища в документа:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result; Резултат:
+--------+ | Result | +--------+ | 1 | +--------+
В този пример търсихме два пътя. Единият път съществува, а другият не. Но имаме 1 така или иначе (положителен резултат). Това е така, защото използвахме one като втори аргумент. one указва, че ще получим 1 ако съществува някой от пътищата.
Ето какво се случва, ако използваме all като втори аргумент:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result; Резултат:
+--------+ | Result | +--------+ | 0 | +--------+
Този път резултатът е 0 , тъй като не всички пътища съществуват в JSON документа.
Ако променим липсващия път ($.type ) спрямо този, който съществува, получаваме различен резултат:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result; Резултат:
+--------+ | Result | +--------+ | 1 | +--------+
Масиви
Ето пример, който тества дали даден индекс съществува в масив:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[2]'
) AS Result; Резултат:
+--------+ | Result | +--------+ | 1 | +--------+
И ето какво се случва, ако увеличим индекса до несъществуващ:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[3]'
) AS Result; Резултат:
+--------+ | Result | +--------+ | 0 | +--------+
Вложени структури
Ето пример, който търси път в рамките на вложен документ:
SET @json_document = '
{
"name": "Wag",
"specs": {
"weight": 10,
"height": 30
}
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.specs.height'
) AS Result; Резултат:
+--------+ | Result | +--------+ | 1 | +--------+
Нулеви аргументи
Ако някой аргумент е NULL , резултатът е 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; Резултат:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Неправилен брой параметри
Предоставянето на без аргументи води до грешка:
SELECT JSON_CONTAINS_PATH(); Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
Същото се случва, когато не предадете достатъчно аргументи:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document); Резултат:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'