MariaDB
 sql >> Base de Dados >  >> RDS >> MariaDB

MariaDB JSON_EXTRACT() explicado


No MariaDB, JSON_EXTRACT() é uma função interna que extrai dados de um documento JSON, com base em um determinado caminho ou caminhos.

Ele pode retornar valores únicos e vários valores. Se um único valor for correspondido, um único valor será retornado. Se vários valores forem correspondidos, esses valores serão retornados em uma matriz.

Sintaxe


A sintaxe fica assim:
JSON_EXTRACT(json_doc, path[, path] ...)

Onde json_doc é o documento JSON e cada path argumento é um caminho dentro do documento.

Exemplo


Aqui está um exemplo para demonstrar.
SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name');

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

Vários caminhos


Aqui está um exemplo de especificação de vários caminhos para retornar vários valores do documento JSON.

Quando você retorna vários valores, eles são retornados em uma matriz.
SET @json_document = '
    { 
        "name": "Wag", 
        "type": "Dog", 
        "weight": 20 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.name', '$.weight');

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

Caminhos inexistentes


Passar um caminho que não existe no documento JSON resulta em NULL .

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

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

No entanto, se vários caminhos forem passados ​​e pelo menos um deles corresponder, o valor correspondente será extraído e retornado em uma matriz. Isso é verdade mesmo se apenas um valor for extraído.

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

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

Matrizes


Aqui está um exemplo de extração de dados de uma matriz:
SET @json_document = '
    { 
        "_id" : 1, 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';
SELECT JSON_EXTRACT(@json_document, '$.awards[0]');

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

As matrizes são baseadas em zero e, portanto, $.awards[0] extrai o primeiro elemento dos awards variedade.

Objetos aninhados


Aqui está um exemplo de extração de dados de um objeto aninhado dentro de outro objeto:
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;

Resultado:
+---------------+
| Result        |
+---------------+
| "Fastest Dog" |
+---------------+

No entanto, se quiséssemos extrair todos os prêmios, poderíamos encurtar o caminho para $.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;

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

Embelezar o resultado


Podemos tornar o resultado mais fácil de ler passando JSON_EXTRACT() para o JSON_DETAILED() função:
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;

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

Argumentos nulos


Se algum argumento for NULL , o resultado é NULL :
SELECT 
    JSON_EXTRACT(null, '$.type'),
    JSON_EXTRACT('{"a":1}', null);

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

Contagem de parâmetros incorreta


Não fornecer argumentos resulta em um erro:
SELECT JSON_EXTRACT();

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

É o mesmo quando você fornece poucos ou muitos argumentos:
SELECT JSON_EXTRACT('{ "a": 1}');

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