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

Spiegazione di MariaDB JSON_EXTRACT()

In MariaDB, JSON_EXTRACT() è una funzione integrata che estrae i dati da un documento JSON, in base a un determinato percorso.

Può restituire valori singoli e valori multipli. Se viene trovato un valore singolo, viene restituito un valore singolo. Se vengono confrontati più valori, tali valori vengono restituiti in una matrice.

Sintassi

La sintassi è questa:

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

Dove json_doc è il documento JSON e ogni path argomento è un percorso all'interno del documento.

Esempio

Ecco un esempio da dimostrare.

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

Risultato:

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

Percorsi multipli

Ecco un esempio di specificazione di più percorsi per restituire più valori dal documento JSON.

Quando restituisci più valori, questi vengono restituiti in una matrice.

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

Risultato:

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

Percorsi inesistenti

Il passaggio di un percorso che non esiste nel documento JSON restituisce NULL .

Esempio:

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

Risultato:

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

Tuttavia, se vengono passati più percorsi e almeno uno di essi corrisponde, il valore corrispondente viene estratto e restituito in una matrice. Questo è vero anche se viene estratto un solo valore.

Esempio:

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

Risultato:

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

Array

Ecco un esempio di estrazione di dati da un array:

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

Risultato:

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

Gli array sono a base zero, quindi $.awards[0] estrae il primo elemento dei awards matrice.

Oggetti nidificati

Ecco un esempio di estrazione di dati da un oggetto annidato all'interno di un altro oggetto:

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;

Risultato:

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

Tuttavia, se volessimo estrarre tutti i premi, potremmo abbreviare il percorso a $.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;

Risultato:

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

Abbellire il risultato

Possiamo semplificare la lettura del risultato passando JSON_EXTRACT() al JSON_DETAILED() funzione:

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;

Risultato:

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

Argomenti nulli

Se un argomento è NULL , il risultato è NULL :

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

Risultato:

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

Conteggio parametri errato

Non fornire argomenti genera un errore:

SELECT JSON_EXTRACT();

Risultato:

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

È lo stesso quando fornisci troppi pochi o troppi argomenti:

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

Risultato:

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