I MariaDB, JSON_CONTAINS()
är en inbyggd funktion som låter dig ta reda på om ett angivet värde finns i det givna JSON-dokumentet, eller vid en specifik sökväg i dokumentet.
Den returnerar 1
om den innehåller värdet, 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(json_doc, val[, path])
Där json_doc
är JSON-dokumentet, val
är värdet som ska hittas och path
ett valfritt värde som anger en sökväg i dokumentet.
Exempel
Här är ett exempel att visa.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}');
Resultat:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Wag"}') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
I det här fallet var det en matchning och resultatet är 1
.
I nästa exempel finns det ingen matchning:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}');
Resultat:
+---------------------------------------------------+ | JSON_CONTAINS(@json_document, '{"name": "Woof"}') | +---------------------------------------------------+ | 0 | +---------------------------------------------------+
Observera att värdet är inneslutet i hängslen.
Så här händer när det andra argumentet inte är giltigt:
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)
Låt oss se varningen:
SHOW WARNINGS;
Resultat:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Ange en sökväg
Du kan valfritt använda ett tredje argument för att ange en sökväg.
Exempel:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight');
Resultat:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
När jag angav en sökväg behövde jag inte använda hängslen.
Här är en som söker efter en sträng:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name');
Resultat:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
Lägg märke till att jag använde dubbla citattecken i de enkla citattecken. Om jag utelämnar de dubbla citattecken händer det här:
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)
Och låt oss kolla varningen:
SHOW WARNINGS;
Resultat:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Inkapslade strukturer
Här är ett exempel som letar efter ett värde i ett kapslat 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 | +-----------------------------------------------------+
Nollargument
Om något av argumenten är NULL
, resultatet är 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 | +------+------+------+
Felaktig parameterräkning
Att inte tillhandahålla några argument resulterar i ett fel:
SELECT JSON_CONTAINS();
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
Det är samma sak när du ger för många argument:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3);
Resultat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'