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'