I MariaDB, JSON_CONTAINS_PATH()
er en indbygget funktion, der angiver, om et givet JSON-dokument indeholder data på den eller de angivne stier.
Det returnerer 1
hvis dokumentet indeholder data ved den/de angivne sti(er), 0
hvis den ikke gør det, og NULL
hvis nogen af argumenterne er NULL
.
Syntaks
Syntaksen ser sådan ud:
JSON_CONTAINS_PATH(json_doc, return_arg, path[, path] ...)
Hvor json_doc
er JSON-dokumentet og path
angiver stien, som data skal findes for. Der kan angives flere stier.
return_arg
argument bestemmer, hvordan man håndterer flere stier. Det kan være one
eller all
.
one
– Funktionen returnerer1
hvis der findes mindst én sti i JSON-dokumentet.all
– Funktionen returnerer1
kun hvis alle stier findes i JSON-dokumentet.
Eksempel
Her er et eksempel til at demonstrere.
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 dette tilfælde eksisterer stien, og resultatet er 1
.
I det næste eksempel eksisterer stien ikke, og resultatet er 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 | +-----------------------------------------------------+
Flere stier
Her er nogle eksempler, der søger efter flere stier i dokumentet:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'one',
'$.type',
'$.weight'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 1 | +--------+
I dette eksempel søgte vi efter to veje. Den ene vej eksisterer, og den anden gør ikke. Men vi fik en 1
alligevel (et positivt resultat). Dette skyldes, at vi brugte one
som det andet argument. one
angiver, at vi får en 1
hvis nogen af stierne findes.
Her er, hvad der sker, hvis vi bruger all
som det andet argument:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.type',
'$.weight'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 0 | +--------+
Denne gang er resultatet 0
, fordi ikke alle stier findes i JSON-dokumentet.
Hvis vi ændrer den manglende sti ($.type
) til en, der eksisterer, får vi et andet resultat:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS_PATH(
@json_document,
'all',
'$.name',
'$.weight'
) AS Result;
Resultat:
+--------+ | Result | +--------+ | 1 | +--------+
Arrays
Her er et eksempel, der tester, om et givet indeks findes i et 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 | +--------+
Og her er, hvad der sker, hvis vi øger indekset til et ikke-eksisterende:
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 | +--------+
Indlejrede strukturer
Her er et eksempel, der leder efter en sti i et indlejret 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 | +--------+
Nul-argumenter
Hvis et argument er NULL
, resultatet er 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 | +------+------+------+
Forkert parameterantal
Angivelse af ingen argumenter resulterer i en fejl:
SELECT JSON_CONTAINS_PATH();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS_PATH'
Det samme sker, når du ikke sender nok argumenter:
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'