sql >> Database teknologi >  >> RDS >> MariaDB

MariaDB JSON_EXTRACT() Forklaret

I MariaDB, JSON_EXTRACT() er en indbygget funktion, der udtrækker data fra et JSON-dokument, baseret på en given sti eller stier.

Det kan returnere enkelte værdier og flere værdier. Hvis en enkelt værdi matches, returneres en enkelt værdi. Hvis flere værdier matches, returneres disse værdier i en matrix.

Syntaks

Syntaksen ser sådan ud:

JSON_EXTRACT(json_doc, path[, path] ...)

Hvor json_doc er JSON-dokumentet og hver path argument er en sti i dokumentet.

Eksempel

Her er et eksempel til at demonstrere.

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name');

Resultat:

+----------------------------------------+
| JSON_EXTRACT(@json_document, '$.name') |
+----------------------------------------+
| "Wag"                                  |
+----------------------------------------+

Flere stier

Her er et eksempel på at angive flere stier for at returnere flere værdier fra JSON-dokumentet.

Når du returnerer flere værdier, returneres de i en matrix.

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');

Resultat:

+----------------------------------------------------+
| JSON_EXTRACT(@json_document, '$.name', '$.weight') |
+----------------------------------------------------+
| ["Wag", 20]                                        |
+----------------------------------------------------+

Ikke-eksisterende stier

At sende en sti, der ikke findes i JSON-dokumentet, resulterer i NULL .

Eksempel:

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.color');

Resultat:

+-----------------------------------------+
| JSON_EXTRACT(@json_document, '$.color') |
+-----------------------------------------+
| NULL                                    |
+-----------------------------------------+

Men hvis flere stier passeres, og mindst én af dem matcher, udtrækkes den matchende værdi og returneres i et array. Dette gælder, selvom kun én værdi er udtrukket.

Eksempel:

SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.color');

Resultat:

+---------------------------------------------------+
| JSON_EXTRACT(@json_document, '$.name', '$.color') |
+---------------------------------------------------+
| ["Wag"]                                           |
+---------------------------------------------------+

Arrays

Her er et eksempel på udtrækning af data fra et array:

SET @json_document = '
    { 
        "_id" : 1, 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');

Resultat:

+---------------------------------------------+
| JSON_EXTRACT(@json_document, '$.awards[0]') |
+---------------------------------------------+
| "Top Dog"                                   |
+---------------------------------------------+

Arrays er nul-baserede, og derfor $.awards[0] udtrækker det første element af awards array.

Indlejrede objekter

Her er et eksempel på udtrækning af data fra et objekt indlejret i et andet objekt:

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_EXTRACT(
    @json_document, 
    '$.details.awards.New York Marathon'
    ) AS Result;

Resultat:

+---------------+
| Result        |
+---------------+
| "Fastest Dog" |
+---------------+

Men hvis vi ville udtrække alle priser, kunne vi forkorte stien til $.details.awards :

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_EXTRACT(
    @json_document, 
    '$.details.awards'
    ) AS Result;

Resultat:

+---------------------------------------------------------------------------------------------------+
| Result                                                                                            |
+---------------------------------------------------------------------------------------------------+
| {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"} |
+---------------------------------------------------------------------------------------------------+

Fremstil resultatet

Vi kan gøre resultatet lettere at læse ved at sende JSON_EXTRACT() til JSON_DETAILED() funktion:

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_DETAILED(
        JSON_EXTRACT(
            @json_document, 
            '$.details.awards'
            ) 
    ) AS Result;

Resultat:

+------------------------------------------------+
| Result                                         |
+------------------------------------------------+
| {
    "Florida Dog Awards": "Top Dog",
    "New York Marathon": "Fastest Dog",
    "Sumo 2020": "Biggest Dog"
} |
+------------------------------------------------+

Nul-argumenter

Hvis et argument er NULL , resultatet er NULL :

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

Resultat:

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

Forkert parameterantal

Angivelse af ingen argumenter resulterer i en fejl:

SELECT JSON_EXTRACT();

Resultat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'

Det er det samme, når du giver for få eller for mange argumenter:

SELECT JSON_EXTRACT('{ "a": 1}');

Resultat:

ERROR 1582 (42000): Incorrect parameter count in the call to native function 'JSON_EXTRACT'

  1. Beregning af kumulativ sum i PostgreSQL

  2. MySQL-udløsere kan ikke opdatere rækker i samme tabel, som triggeren er tildelt. Foreslået løsning?

  3. Find referenceenheder i SQL Server:sys.dm_sql_referencing_entities()

  4. GroupingError:ERROR:kolonnen skal vises i GROUP BY-sætningen eller bruges i en aggregeret funktion