sql >> Databasteknik >  >> RDS >> MariaDB

MariaDB JSON_EXTRACT() Förklarad

I MariaDB, JSON_EXTRACT() är en inbyggd funktion som extraherar data från ett JSON-dokument, baserat på en given sökväg eller sökvägar.

Det kan returnera enstaka värden och flera värden. Om ett enskilt värde matchas, returneras ett enstaka värde. Om flera värden matchas, returneras dessa värden i en array.

Syntax

Syntaxen ser ut så här:

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

Där json_doc är JSON-dokumentet och varje path argument är en sökväg i dokumentet.

Exempel

Här är ett exempel att visa.

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

Resultat:

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

Flera vägar

Här är ett exempel på hur du anger flera sökvägar för att returnera flera värden från JSON-dokumentet.

När du returnerar flera värden, returneras de i en array.

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]                                        |
+----------------------------------------------------+

Icke-existerande vägar

Att skicka en sökväg som inte finns i JSON-dokumentet resulterar i NULL .

Exempel:

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

Resultat:

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

Men om flera vägar passeras, och minst en av dem matchar, extraheras det matchande värdet och returneras i en array. Detta gäller även om endast ett värde extraheras.

Exempel:

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

Resultat:

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

Arrayer

Här är ett exempel på att extrahera data från en 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"                                   |
+---------------------------------------------+

Arrayer är nollbaserade, och så $.awards[0] extraherar det första elementet i awards array.

Inkapslade objekt

Här är ett exempel på att extrahera data från ett objekt kapslat inuti ett annat 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 om vi vill extrahera alla utmärkelser kan vi förkorta vägen till $.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"} |
+---------------------------------------------------------------------------------------------------+

Förskön resultatet

Vi kan göra resultatet lättare att läsa genom att skicka JSON_EXTRACT() till 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"
} |
+------------------------------------------------+

Nollargument

Om något argument är NULL , resultatet är NULL :

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

Resultat:

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

Felaktig parameterräkning

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

SELECT JSON_EXTRACT();

Resultat:

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

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

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

Resultat:

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

  1. Hur man konverterar MySQL-tid

  2. Beräknar värde med hjälp av föregående värde på en rad i T-SQL

  3. Statisk och dynamisk datamaskering i FieldShield

  4. Vilken storlek använder du för varchar(MAX) i din parameterdeklaration?