I MariaDB, JSON_CONTAINS()
er en indbygget funktion, der giver dig mulighed for at finde ud af, om en specificeret værdi findes i det givne JSON-dokument eller ved en bestemt sti i dokumentet.
Det returnerer 1
hvis den indeholder værdien, 0
hvis den ikke gør det, og NULL
hvis nogen af argumenterne er NULL
.
Syntaks
Syntaksen ser sådan ud:
JSON_CONTAINS(json_doc, val[, path])
Hvor json_doc
er JSON-dokumentet, val
er den værdi, der skal findes, og path
en valgfri værdi, der angiver en sti i dokumentet.
Eksempel
Her er et eksempel til at demonstrere.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');
Resultat:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Wag"}') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
I dette tilfælde var der et match, og resultatet er 1
.
I det næste eksempel er der ingen match:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');
Resultat:
+---------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Woof"}') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+
Bemærk, at værdien er omgivet af krøllede seler.
Her er, hvad der sker, når det andet argument ikke er gyldigt:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag');
Resultat:
+--------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Lad os se advarslen:
SHOW WARNINGS;
Resultat:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Angiv en sti
Du kan valgfrit bruge et tredje argument til at angive en sti.
Eksempel:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight');
Resultat:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
Da jeg specificerede en sti, behøvede jeg ikke at bruge krøllede seler.
Her er en, der søger efter en streng:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');
Resultat:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
Bemærk, at jeg brugte dobbelte anførselstegn inde i de enkelte anførselstegn. Hvis jeg udelader de dobbelte anførselstegn, sker der her:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name');
Resultat:
+------------------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag', '$.name') | +------------------------------------------------+ | NULL | +------------------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Og lad os tjekke advarslen:
SHOW WARNINGS;
Resultat:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Indlejrede strukturer
Her er et eksempel, der leder efter en værdi i et indlejret dokument:
SET @json_document = '{ "name": "Wag", "specs": { "weight": 10, "height": 30 } }';
SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height');
Resultat:
+-----------------------------------------------------+ | JSON_CONTAINS(@json_document, 30, '$.specs.height') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Nul-argumenter
Hvis nogle af argumenterne er NULL
, resultatet er 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;
Resultat:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Forkert parameterantal
Angivelse af ingen argumenter resulterer i en fejl:
SELECT JSON_CONTAINS();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
Det er det samme, når du giver for mange argumenter:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'