In MariaDB, JSON_CONTAINS() is een ingebouwde functie waarmee u kunt achterhalen of een opgegeven waarde wordt gevonden in het gegeven JSON-document of op een specifiek pad binnen het document.
Het retourneert 1 als het de waarde bevat, 0 als dat niet het geval is, en NULL als een van de argumenten NULL is .
Syntaxis
De syntaxis gaat als volgt:
JSON_CONTAINS(json_doc, val[, path])
Waar json_doc is het JSON-document, val is de waarde die moet worden gevonden, en path een optionele waarde die een pad binnen het document aangeeft.
Voorbeeld
Hier is een voorbeeld om te demonstreren.
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Wag"}'); Resultaat:
+--------------------------------------------------+
| JSON_CONTAINS(@json_document, '{"name": "Wag"}') |
+--------------------------------------------------+
| 1 |
+--------------------------------------------------+
In dit geval was er een overeenkomst en het resultaat is 1 .
In het volgende voorbeeld is er geen overeenkomst:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '{"name": "Woof"}'); Resultaat:
+---------------------------------------------------+
| JSON_CONTAINS(@json_document, '{"name": "Woof"}') |
+---------------------------------------------------+
| 0 |
+---------------------------------------------------+ Merk op dat de waarde tussen accolades staat.
Dit is wat er gebeurt als het tweede argument niet geldig is:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag'); Resultaat:
+--------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag') | +--------------------------------------+ | NULL | +--------------------------------------+ 1 row in set, 1 warning (0.000 sec)
Laten we eens kijken naar de waarschuwing:
SHOW WARNINGS; Resultaat:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Geef een pad op
U kunt optioneel een derde argument gebruiken om een pad op te geven.
Voorbeeld:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 10, '$.weight'); Resultaat:
+-----------------------------------------------+ | JSON_CONTAINS(@json_document, 10, '$.weight') | +-----------------------------------------------+ | 1 | +-----------------------------------------------+
Bij het specificeren van een pad hoefde ik geen accolades te gebruiken.
Hier is er een die naar een tekenreeks zoekt:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, '"Wag"', '$.name'); Resultaat:
+--------------------------------------------------+ | JSON_CONTAINS(@json_document, '"Wag"', '$.name') | +--------------------------------------------------+ | 1 | +--------------------------------------------------+
Merk op dat ik dubbele aanhalingstekens binnen de enkele aanhalingstekens heb gebruikt. Als ik de dubbele aanhalingstekens weglaat, gebeurt het volgende:
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT JSON_CONTAINS(@json_document, 'Wag', '$.name'); Resultaat:
+------------------------------------------------+ | JSON_CONTAINS(@json_document, 'Wag', '$.name') | +------------------------------------------------+ | NULL | +------------------------------------------------+ 1 row in set, 1 warning (0.000 sec)
En laten we de waarschuwing eens bekijken:
SHOW WARNINGS; Resultaat:
+---------+------+-----------------------------------------------------------------------------------+ | Level | Code | Message | +---------+------+-----------------------------------------------------------------------------------+ | Warning | 4038 | Syntax error in JSON text in argument 2 to function 'json_contains' at position 1 | +---------+------+-----------------------------------------------------------------------------------+
Geneste structuren
Hier is een voorbeeld dat zoekt naar een waarde in een genest document:
SET @json_document = '{ "name": "Wag", "specs": { "weight": 10, "height": 30 } }';
SELECT JSON_CONTAINS(@json_document, 30, '$.specs.height'); Resultaat:
+-----------------------------------------------------+ | JSON_CONTAINS(@json_document, 30, '$.specs.height') | +-----------------------------------------------------+ | 1 | +-----------------------------------------------------+
Nullargumenten
Als een van de argumenten NULL . is , het resultaat is 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; Resultaat:
+------+------+------+ | a | b | c | +------+------+------+ | NULL | NULL | NULL | +------+------+------+
Onjuist aantal parameters
Het verstrekken van geen argumenten resulteert in een fout:
SELECT JSON_CONTAINS(); Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'
Het is hetzelfde als je te veel argumenten geeft:
SELECT JSON_CONTAINS('{ "a": 1}', 1, 2, 3); Resultaat:
ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_CONTAINS'