sql >> Database >  >> RDS >> MariaDB

MariaDB JSON_CONTAINS() uitgelegd

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'

  1. Voor Nvarchar (Max) krijg ik maar 4000 tekens in TSQL?

  2. Moet het laten vallen van een database in geen enkele transactie gebeuren?

  3. Microsoft Access versus SQL Server

  4. Lopend totaal berekenen met OVER-clausule en PARTITION BY-clausule in SQL Server