sql >> Database >  >> RDS >> MariaDB

MariaDB JSON_EXTRACT() uitgelegd

In MariaDB, JSON_EXTRACT() is een ingebouwde functie die gegevens extraheert uit een JSON-document, op basis van een bepaald pad of paden.

Het kan enkele waarden en meerdere waarden retourneren. Als een enkele waarde overeenkomt, wordt een enkele waarde geretourneerd. Als meerdere waarden overeenkomen, worden die waarden geretourneerd in een array.

Syntaxis

De syntaxis gaat als volgt:

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

Waar json_doc is het JSON-document, en elk path argument is een pad binnen het document.

Voorbeeld

Hier is een voorbeeld om te demonstreren.

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

Resultaat:

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

Meerdere paden

Hier is een voorbeeld van het specificeren van meerdere paden om meerdere waarden uit het JSON-document te retourneren.

Wanneer u meerdere waarden retourneert, worden deze geretourneerd in een array.

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

Resultaat:

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

Niet-bestaande paden

Het doorgeven van een pad dat niet bestaat in het JSON-document resulteert in NULL .

Voorbeeld:

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

Resultaat:

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

Als er echter meerdere paden worden doorgegeven, en ten minste één ervan komt overeen, dan wordt de overeenkomende waarde geëxtraheerd en geretourneerd in een array. Dit geldt zelfs als er maar één waarde wordt geëxtraheerd.

Voorbeeld:

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

Resultaat:

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

Arrays

Hier is een voorbeeld van het extraheren van gegevens uit een array:

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

Resultaat:

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

Arrays zijn gebaseerd op nul, en dus $.awards[0] extraheert het eerste element van de awards array.

geneste objecten

Hier is een voorbeeld van het extraheren van gegevens uit een object dat in een ander object is genest:

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;

Resultaat:

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

Als we echter alle onderscheidingen wilden extraheren, zouden we het pad naar $.details.awards kunnen inkorten :

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;

Resultaat:

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

Maak het resultaat mooier

We kunnen het resultaat gemakkelijker leesbaar maken door JSON_EXTRACT() . door te geven naar de JSON_DETAILED() functie:

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;

Resultaat:

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

Nullargumenten

Als een argument NULL is , het resultaat is NULL :

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

Resultaat:

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

Onjuist aantal parameters

Het verstrekken van geen argumenten resulteert in een fout:

SELECT JSON_EXTRACT();

Resultaat:

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

Hetzelfde geldt wanneer u te weinig of te veel argumenten geeft:

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

Resultaat:

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

  1. Voorwaardelijk aantal SQL's

  2. Converteer VARCHAR2 naar Getal

  3. SQL Server UNION - Wat is het standaard ORDER BY-gedrag?

  4. Hoe tekenreeksen van een tekenreeksveld samenvoegen in een PostgreSQL 'groeperen op'-query?