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

Como a etapa curinga JSONPath (**) funciona no MariaDB


Ao trabalhar com JSON no MariaDB, você pode usar expressões JSONPath para manipular dados em um documento JSON.

Um recurso poderoso que o MariaDB fornece é a etapa curinga (** ). Isso permite que você selecione recursivamente todos os elementos filho do elemento atual.

A etapa curinga é uma extensão não padrão e também é suportada com o mesmo significado no MySQL.

Exemplo


Segue um exemplo para demonstrar:
SET @json = '[
    { "name" : "Wag", "type" : "Dog" },
    { "name" : "Bark", "type" : "Dog" },
    { "name" : "Meow", "type" : "Cat" },
    { "name" : "Scratch", "type" : "Cat" }
]';

SELECT JSON_EXTRACT(@json, '$**.name');

Resultado:
+------------------------------------+
| JSON_EXTRACT(@json, '$**.name')    |
+------------------------------------+
| ["Wag", "Bark", "Meow", "Scratch"] |
+------------------------------------+

A etapa curinga passou por todos os objetos e selecionou os valores de seu name membros.

Nesse caso, poderíamos ter obtido o mesmo resultado com outro seletor. O seletor curinga de array nos ajudaria a obter o mesmo resultado:
SET @json = '[
    { "name" : "Wag", "type" : "Dog" },
    { "name" : "Bark", "type" : "Dog" },
    { "name" : "Meow", "type" : "Cat" },
    { "name" : "Scratch", "type" : "Cat" }
]';

SELECT JSON_EXTRACT(@json, '$[*].name');

Resultado:
+------------------------------------+
| JSON_EXTRACT(@json, '$[*].name')   |
+------------------------------------+
| ["Wag", "Bark", "Meow", "Scratch"] |
+------------------------------------+

Mesmo resultado.

No entanto, as coisas mudam se usarmos um documento diferente.

Exemplo 2


No exemplo a seguir, obtemos um resultado diferente entre a etapa curinga e o seletor de matriz:
SET @json = '[
    { 
        "name" : "Homer", 
        "pets" : [
            { 
            "name" : "Wag",
            "type" : "Dog"
            },
            { 
            "name" : "Scratch",
            "type" : "Cat"
            }
        ]    
    }
]';

SELECT 
    JSON_EXTRACT(@json, '$**.name'),
    JSON_EXTRACT(@json, '$[*].name');

Resultado:
+---------------------------------+----------------------------------+
| JSON_EXTRACT(@json, '$**.name') | JSON_EXTRACT(@json, '$[*].name') |
+---------------------------------+----------------------------------+
| ["Homer", "Wag", "Scratch"]     | ["Homer"]                        |
+---------------------------------+----------------------------------+

Resultado diferente.

Os resultados obviamente dependerão do documento e da construção real da expressão JSONPath, e os seletores usados ​​dependerão de seus requisitos.

Uma coisa a lembrar é que a etapa curinga não deve ser a última etapa na expressão JSONPath. Ele deve ser seguido por uma etapa de seletor de membro de matriz ou objeto.

Exemplo 3


Aqui está um exemplo que retorna o segundo elemento de array de todos os arrays chamados sizes , incluindo matrizes aninhadas em outros documentos:
SET @json = '[
    { 
        "_id": 1, 
        "product": { 
            "name" : "Tuxedo", 
            "color" : "Blue",
            "sizes": [ "S", "M", "L" ],
            "accessories" : {
                "belt" : {
                    "color" : "Navy",
                    "sizes" : [ "Wide", "Narrow" ]
                },
                "tie" : {
                    "color" : "Black",
                    "sizes" : [ "Short", "Medium", "Long" ]
                }
            }
        }
    }
]';

SELECT JSON_EXTRACT(@json, '$**.sizes[1]');

Resultado:
+-------------------------------------+
| JSON_EXTRACT(@json, '$**.sizes[1]') |
+-------------------------------------+
| ["M", "Narrow", "Medium"]           |
+-------------------------------------+

As matrizes são baseadas em zero e, portanto, $**.sizes[1] refere-se ao segundo elemento em todos os sizes matrizes.