sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_CONTAINS() Förklarad

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'

  1. Hur man uppdaterar/tar bort med element från två olika tabeller SQLite

  2. Hur kan jag lista har samma id-data som while loop i PHP?

  3. UTL_FILE.FREMOVE Exempel:Ta bort en fil i Oracle

  4. PostgreSQL - FEL:kolumndatum kan inte skickas till typdatum