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

MariaDB JSON_EXISTS() explicado


No MariaDB, JSON_EXISTS() é uma função interna que permite verificar se existe um valor em um caminho especificado no documento JSON.

Ele aceita o documento JSON como argumento e retorna 1 se o caminho for encontrado e 0 se não for.

A documentação do MariaDB afirma que a função “determina se um valor JSON especificado existe nos dados fornecidos”. No entanto, a função não parece realmente verificar um determinado valor. Provavelmente é mais correto dizer que determina se um caminho especificado existe ou que existe um valor no caminho especificado.

Para verificar se o valor real existe, você pode usar o JSON_CONTAINS() função.

Sintaxe


A sintaxe fica assim:
JSON_EXISTS(json_doc, path) 

Onde json_doc é o documento JSON e o path é o caminho para encontrar.

Exemplo


Aqui está um exemplo para demonstrar.
SELECT JSON_EXISTS('{ "name": "Wag" }', '$.name'); 

Resultado:
+--------------------------------------------+| JSON_EXISTS('{ "name":"Wag" }', '$.name') |+---------------------------- ----------------+| 1 |+--------------------------------------------+ 
Nesse caso, o caminho é encontrado e o resultado é 1 .

Se o caminho não for encontrado, o resultado será 0 , assim:
SELECT JSON_EXISTS('{ "name": "Wag" }', '$.type'); 

Resultado:
+--------------------------------------------+| JSON_EXISTS('{ "name":"Wag" }', '$.type') |+---------------------------- ----------------+| 0 |+--------------------------------------------+ 

Matrizes


Neste exemplo, verifico a existência de um elemento em um determinado índice de uma matriz:
SELECT JSON_EXISTS(
    '{ 
        "name": "Wag", 
        "scores": [ 10, 8, 7 ] 
    }', 
    "$.scores[2]"
    ) AS Result; 

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

Aqui está o que acontece se o índice não existir na matriz:
SELECT JSON_EXISTS(
    '{ 
        "name": "Wag", 
        "scores": [ 10, 8, 7 ] 
    }', 
    '$.scores[3]'
    ) AS Result; 

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

Documento JSON maior


Aqui está um exemplo que usa um documento JSON um pouco maior. Aqui, verifico uma chave que existe em vários níveis de aninhamento:
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_EXISTS(
    @json_document, 
    '$.details.awards.Sumo 2020'
    ) AS Result; 

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

Argumentos nulos


Se algum dos argumentos for NULL , o resultado é NULL :
SELECT 
    JSON_EXISTS(null, '$.a'),
    JSON_EXISTS('{ "a": 1 }', null); 

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

JSON inválido


Passando resultados JSON inválidos em NULL :
SELECT JSON_EXISTS('{1}', '$.a'); 

Resultado:
+---------------------------+| JSON_EXISTS('{1}', '$.a') |+--------------------------------------+| NULL |+---------------------------+

Contagem de parâmetros incorreta


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

Resultado:
ERRO 1582 (42000):contagem de parâmetro incorreta na chamada para a função nativa 'JSON_EXISTS'

É o mesmo quando você fornece muitos argumentos:
SELECT JSON_EXISTS('{"a": 1}', '$.a', 3); 

Resultado:
ERRO 1582 (42000):contagem de parâmetro incorreta na chamada para a função nativa 'JSON_EXISTS'