sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_EXISTS() Förklarad

I MariaDB, JSON_EXISTS() är en inbyggd funktion som låter dig kontrollera om ett värde finns på en angiven sökväg i JSON-dokumentet.

Den accepterar JSON-dokumentet som ett argument och returnerar 1 om sökvägen hittas och 0 om det inte är det.

MariaDB-dokumentationen säger att funktionen "bestämmer om ett specificerat JSON-värde finns i den givna datan". Funktionen verkar dock inte kontrollera ett givet värde. Det är förmodligen mer korrekt att säga att det avgör om en angiven sökväg finns, eller att ett värde finns på den angivna sökvägen.

För att kontrollera att det faktiska värdet finns, kan du använda JSON_CONTAINS() funktion.

Syntax

Syntaxen ser ut så här:

JSON_EXISTS(json_doc, path) 

Där json_doc är JSON-dokumentet och path är vägen att hitta.

Exempel

Här är ett exempel att visa.

SELECT JSON_EXISTS('{ "name": "Wag" }', '$.name'); 

Resultat:

+----------------------------------------------------+| JSON_EXISTS('{ "name":"Wag" }', '$.name') |+---------------------------- ----------------+| 1 |+----------------------------------------------------+ 

I det här fallet hittas sökvägen och resultatet är 1 .

Om sökvägen inte hittas är resultatet 0 , så här:

SELECT JSON_EXISTS('{ "name": "Wag" }', '$.type'); 

Resultat:

+----------------------------------------------------+| JSON_EXISTS('{ "name":"Wag" }', '$.type') |+---------------------------- ----------------+| 0 |+----------------------------------------------------+ 

Arrayer

I det här exemplet kontrollerar jag om det finns ett element vid ett givet index för en array:

SELECT JSON_EXISTS(
    '{ 
        "name": "Wag", 
        "scores": [ 10, 8, 7 ] 
    }', 
    "$.scores[2]"
    ) AS Result; 

Resultat:

+--------+| Resultat |+--------+| 1 |+--------+

Så här händer om indexet inte finns i arrayen:

SELECT JSON_EXISTS(
    '{ 
        "name": "Wag", 
        "scores": [ 10, 8, 7 ] 
    }', 
    '$.scores[3]'
    ) AS Result; 

Resultat:

+--------+| Resultat |+--------+| 0 |+--------+

Större JSON-dokument

Här är ett exempel som använder ett lite större JSON-dokument. Här letar jag efter en nyckel som finns inom flera nivåer av kapsling:

SET @json_document = '
    { 
        "_id" : 1, 
        "name" : "Wag", 
        "details" : {
            "type" : "Dog", 
            "weight" : 20,
            "awards" : { 
                "Florida Dog Awards" : "Top Dog", 
                "New York Marathon" : "Fastest Dog", 
                "Sumo 2020" : "Biggest Dog"
            }
        }
    }
';
SELECT JSON_EXISTS(
    @json_document, 
    '$.details.awards.Sumo 2020'
    ) AS Result; 

Resultat:

+--------+| Resultat |+--------+| 1 |+--------+

Nollargument

Om något av argumenten är NULL , resultatet är NULL :

SELECT 
    JSON_EXISTS(null, '$.a'),
    JSON_EXISTS('{ "a": 1 }', null); 

Resultat:

+---------------------------+------------------------ --------------+| JSON_EXISTS(null, '$.a') | JSON_EXISTS('{ "a":1 }', null) |+--------------------------------+------- --------------------------+| NULL | NULL |+---------------------------+------------------------ -------------+

Ogiltig JSON

Att skicka ogiltig JSON resulterar i NULL :

SELECT JSON_EXISTS('{1}', '$.a'); 

Resultat:

+--------------------------------+| JSON_EXISTS('{1}', '$.a') |+--------------------------------+| NULL |+----------------------------+

Felaktig parameterräkning

Att inte tillhandahålla några argument resulterar i ett fel:

SELECT JSON_EXISTS(); 

Resultat:

ERROR 1582 (42000):Fel parameterräkning i anropet till den inbyggda funktionen 'JSON_EXISTS'

Det är samma sak när du ger för många argument:

SELECT JSON_EXISTS('{"a": 1}', '$.a', 3); 

Resultat:

ERROR 1582 (42000):Fel parameterräkning i anropet till den inbyggda funktionen 'JSON_EXISTS'

  1. Åtgärda "ERROR 1136 (21S01):Kolumnantal matchar inte värderäkning på rad 2" när du använder VALUES Statement i MySQL

  2. Mysql-tillägget är utfasat och kommer att tas bort i framtiden:använd mysqli eller PDO istället

  3. Det gick inte att skicka strängvärde 1,2 som indata till en orakelfråga

  4. Skapa MySQL-frågeövervakningsbash-skript