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

MariaDB JSON_CONTAINS_PATH() explicado


No MariaDB, JSON_CONTAINS_PATH() é uma função interna que indica se um determinado documento JSON contém dados no caminho ou caminhos especificados.

Ele retorna 1 se o documento contiver dados no(s) caminho(s) especificado(s), 0 se não, e NULL se algum dos argumentos for NULL .

Sintaxe


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

Onde json_doc é o documento JSON e o path especifica o caminho para o qual localizar dados. Vários caminhos podem ser fornecidos.

O return_arg argumento determina como lidar com vários caminhos. Pode ser one ou all .
  • one – A função retorna 1 se existir pelo menos um caminho no documento JSON.
  • all – A função retorna 1 somente se todos os caminhos existirem no documento JSON.

Exemplo


Aqui está um exemplo para demonstrar.
SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.name');

Resultado:
+-----------------------------------------------------+
| JSON_CONTAINS_PATH(@json_document, 'one', '$.name') |
+-----------------------------------------------------+
|                                                   1 |
+-----------------------------------------------------+

Nesse caso, o caminho existe e o resultado é 1 .

No próximo exemplo, o caminho não existe e o resultado é 0 :
SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(@json_document, 'one', '$.type');

Resultado:
+-----------------------------------------------------+
| JSON_CONTAINS_PATH(@json_document, 'one', '$.type') |
+-----------------------------------------------------+
|                                                   0 |
+-----------------------------------------------------+

Vários caminhos


Aqui estão alguns exemplos que pesquisam vários caminhos dentro do documento:
SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(
        @json_document, 
        'one', 
        '$.type', 
        '$.weight'
        ) AS Result;

Resultado:
+--------+
| Result |
+--------+
|      1 |
+--------+

Neste exemplo, procuramos dois caminhos. Um caminho existe e o outro não. Mas temos um 1 de qualquer maneira (um resultado positivo). Isso ocorre porque usamos one como segundo argumento. O one especifica que obteremos um 1 se algum dos caminhos existir.

Veja o que acontece se usarmos all como segundo argumento:
SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(
    @json_document, 
    'all', 
    '$.type', 
    '$.weight'
    ) AS Result;

Resultado:
+--------+
| Result |
+--------+
|      0 |
+--------+

Desta vez o resultado é 0 , porque nem todos os caminhos existem no documento JSON.

Se alterarmos o caminho ausente ($.type ) para um que existe, obtemos um resultado diferente:
SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(
    @json_document, 
    'all', 
    '$.name', 
    '$.weight'
    ) AS Result;

Resultado:
+--------+
| Result |
+--------+
|      1 |
+--------+

Matrizes


Aqui está um exemplo que testa se um determinado índice existe dentro de uma matriz:
SET @json_document = '
    { 
        "name": "Wag", 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';

SELECT JSON_CONTAINS_PATH(
        @json_document, 
        'one', 
        '$.awards[2]'
        ) AS Result;

Resultado:
+--------+
| Result |
+--------+
|      1 |
+--------+

E aqui está o que acontece se aumentarmos o índice para um inexistente:
SET @json_document = '
    { 
        "name": "Wag", 
        "awards" : [ "Top Dog", "Best Dog", "Biggest Dog" ] 
    }
';

SELECT JSON_CONTAINS_PATH(
        @json_document, 
        'one', 
        '$.awards[3]'
        ) AS Result;

Resultado:
+--------+
| Result |
+--------+
|      0 |
+--------+

Estruturas aninhadas


Aqui está um exemplo que procura um caminho dentro de um documento aninhado:
SET @json_document = '
    { 
        "name": "Wag", 
        "specs": { 
            "weight": 10, 
            "height": 30 
            } 
    }
';

SELECT JSON_CONTAINS_PATH(
    @json_document, 
    'one', 
    '$.specs.height'
    ) AS Result;

Resultado:
+--------+
| Result |
+--------+
|      1 |
+--------+

Argumentos nulos


Se algum argumento for NULL , o resultado é NULL :
SET @json_document = '{ "name": "Wag", "weight": 10 }';
SELECT 
    JSON_CONTAINS_PATH(null, 'one', '$.weight') AS a,
    JSON_CONTAINS_PATH(@json_document, null, '$.weight') AS b,
    JSON_CONTAINS_PATH(@json_document, 'one', null) AS c;

Resultado:
+------+------+------+
| a    | b    | c    |
+------+------+------+
| NULL | NULL | NULL |
+------+------+------+

Contagem de parâmetros incorreta


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

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

A mesma coisa acontece quando você não passa argumentos suficientes:
SET @json_document = '{ "name": "Wag", "weight": 10 }';

SELECT JSON_CONTAINS_PATH(@json_document);

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