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

MariaDB JSON_INSERT() explicado


No MariaDB, JSON_INSERT() é uma função interna que insere dados em um documento JSON e retorna o resultado.

Sintaxe


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

Onde json_doc é o documento JSON, path é o caminho para onde os dados devem ser inseridos e val é o valor a ser inserido nesse caminho.

Exemplo


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

Resultado:
+----------------------------------------------+
| JSON_INSERT(@json_document, '$.type', "Dog") |
+----------------------------------------------+
| {"name": "Wag", "type": "Dog"}               |
+----------------------------------------------+

Aqui eu inseri "type": "Dog" no documento.

Neste caso, usei $.type como o caminho. Portanto, type é a chave e Dog é o valor.

Quando o caminho já existe


A passagem de um caminho que já existe no documento JSON resulta no retorno do documento original inalterado.

Exemplo:
SET @json_document = '
    { 
        "name": "Wag"
    }
';
SELECT JSON_INSERT(@json_document, '$.name', "Bark");

Resultado:
+-----------------------------------------------+
| JSON_INSERT(@json_document, '$.name', "Bark") |
+-----------------------------------------------+
| {"name": "Wag"}                               |
+-----------------------------------------------+

Inserindo matrizes


Aqui está um exemplo de inserção de uma matriz em um documento JSON:
SET @json_document = '
    { 
        "name" : "Wag"
    }
';
SELECT JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]');

Resultado:
+--------------------------------------------------------+
| JSON_INSERT(@json_document, '$.scores', '[ 8, 7, 9 ]') |
+--------------------------------------------------------+
| {"name": "Wag", "scores": "[ 8, 7, 9 ]"}               |
+--------------------------------------------------------+

Anexando a matrizes


Aqui está um exemplo de uso de JSON_INSERT() para anexar dados a uma matriz:
SET @json_document = '
    { 
        "_id" : 1, 
        "awards" : [ "Top Dog", "Best Dog" ] 
    }
';
SELECT JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog");

Resultado:
+--------------------------------------------------------------+
| JSON_INSERT(@json_document, '$.awards[2]', "Biggest Dog")    |
+--------------------------------------------------------------+
| {"_id": 1, "awards": ["Top Dog", "Best Dog", "Biggest Dog"]} |
+--------------------------------------------------------------+

No entanto, embora tenha funcionado bem para este exemplo, poderia facilmente ter falhado. Por exemplo, se tentarmos inserir o valor em um lugar diferente no array, não funciona:
SET @json_document = '
    { 
        "_id" : 1, 
        "awards" : [ "Top Dog", "Best Dog" ] 
    }
';
SELECT JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog");

Resultado:
+-----------------------------------------------------------+
| JSON_INSERT(@json_document, '$.awards[1]', "Biggest Dog") |
+-----------------------------------------------------------+
| {"_id": 1, "awards": ["Top Dog", "Best Dog"]}             |
+-----------------------------------------------------------+

Para inserir valores em uma matriz, use o JSON_ARRAY_INSERT() função em vez disso.

Além disso, embora tenhamos conseguido anexar um valor a uma matriz no exemplo acima, provavelmente é melhor usar o JSON_ARRAY_APPEND() função, uma vez que é projetado especificamente para esse fim.

Objetos aninhados


Aqui está um exemplo de inserção de um valor em 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"
            }
        }
    }
';
SELECT JSON_INSERT(
    @json_document, 
    '$.details.awards.Sumo 2020',
    'Biggest Dog'
    );

Resultado:
{"_id": 1, "name": "Wag", "details": {"type": "Dog", "weight": 20, "awards": {"Florida Dog Awards": "Top Dog", "New York Marathon": "Fastest Dog", "Sumo 2020": "Biggest Dog"}}}

Embelezar o resultado


Podemos usar o JSON_DETAILED() função para tornar o resultado mais fácil de ler:
SET @json_document = '
    { 
        "_id" : 1, 
        "name" : "Wag", 
        "details" : {
            "type" : "Dog", 
            "weight" : 20,
            "awards" : { 
                "Florida Dog Awards" : "Top Dog", 
                "New York Marathon" : "Fastest Dog"
            }
        }
    }
';
SELECT 
    JSON_DETAILED(
        JSON_INSERT(
            @json_document, 
            '$.details.awards.Sumo 2020',
            'Biggest Dog'
        )
    );

Resultado:
{
    "_id": 1,
    "name": "Wag",
    "details": 
    {
        "type": "Dog",
        "weight": 20,
        "awards": 
        {
            "Florida Dog Awards": "Top Dog",
            "New York Marathon": "Fastest Dog",
            "Sumo 2020": "Biggest Dog"
        }
    }
}

Argumentos nulos


Se um dos json_document ou path argumentos são NULL , o resultado é NULL :
SELECT 
    JSON_INSERT(null, '$.type', 'Dog'),
    JSON_INSERT('{"a":1}', null, 'Dog');

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

No entanto, se o value argumento é NULL , a chave é adicionada no caminho especificado, com um valor de null :
SELECT JSON_INSERT('{"a":1}', '$.type', null);

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

Contagem de parâmetros incorreta


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

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

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

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

Funções semelhantes


O JSON_REPLACE() função pode atualizar dados existentes.

O JSON_SET() função pode atualizar dados existentes e inserir novos dados. Então JSON_SET() é como JSON_INSERT() e JSON_REPLACE() em uma função.