I MariaDB, JSON_CONTAINS_PATH()
är en inbyggd funktion som indikerar om ett givet JSON-dokument innehåller data vid den eller de angivna sökvägarna.
Den returnerar 1
om dokumentet innehåller data vid den/de angivna sökvägen, 0
om den inte gör det, och NULL
om något av argumenten är NULL
.
Syntax
Syntaxen ser ut så här:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Där json_doc
är JSON-dokumentet och path
anger sökvägen för att hitta data. Flera vägar kan tillhandahållas.
return_arg
argument bestämmer hur man hanterar flera vägar. Det kan vara one
eller all
.
one
– Funktionen returnerar1
om det finns minst en sökväg i JSON-dokumentet.all
– Funktionen returnerar1
endast om alla sökvägar finns i JSON-dokumentet.
Exempel
Här är ett exempel att visa.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');
Resultat:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.name') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
I det här fallet finns sökvägen, och resultatet är 1
.
I nästa exempel existerar inte sökvägen, och resultatet är 0
:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');
Resultat:
+-----------------------------------------------------+ | JSON_CONTAINS_PATH(@json_document, 'one', '$.type') | +-----------------------------------------------------+ | 0 | +-----------------------------------------------------+
Flera vägar
Här är några exempel som söker efter flera sökvägar i dokumentet:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 1 | +--------+
I det här exemplet sökte vi efter två vägar. En väg finns och den andra inte. Men vi fick en 1
i alla fall (ett positivt resultat). Detta beror på att vi använde one
som det andra argumentet. Den one
anger att vi får en 1
om någon av vägarna finns.
Så här händer om vi använder all
som det andra argumentet:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 0 | +--------+
Den här gången är resultatet 0
, eftersom inte alla sökvägar finns i JSON-dokumentet.
Om vi ändrar den saknade sökvägen ($.type
) än en som finns får vi ett annat resultat:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 1 | +--------+
Arrayer
Här är ett exempel som testar om ett givet index finns inom en array:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[2]'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 1 | +--------+
Och här är vad som händer om vi ökar indexet till ett obefintligt:
SET @json_document = '
{
"name": "Wag",
"awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ]
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.awards[3]'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 0 | +--------+
Inkapslade strukturer
Här är ett exempel som letar efter en sökväg i ett kapslat dokument:
SET @json_document = '
{
"name": "Wag",
"specs": {
"weight": 10,
"height": 30
}
}
';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.specs.height'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 1 | +--------+
Nollargument
Om något argument är NULL
, resultatet är 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;
Resultat:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Felaktig parameterräkning
Att inte tillhandahålla några argument resulterar i ett fel:
SELECT JSON_CONTAINS_PATH();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
Samma sak händer när du inte skickar tillräckligt med argument:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(@json_document);
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'