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'