В 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'