sql >> Base de Datos >  >> RDS >> MariaDB

Cómo funciona el paso de comodín JSONPath (**) en MariaDB

Cuando trabaje con JSON en MariaDB, puede usar expresiones JSONPath para manipular datos dentro de un documento JSON.

Una característica poderosa que proporciona MariaDB es el paso comodín (** ). Esto le permite seleccionar recursivamente todos los elementos secundarios del elemento actual.

El paso comodín es una extensión no estándar y también se admite con el mismo significado en MySQL.

Ejemplo

Aquí hay un ejemplo para demostrarlo:

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"] |
+------------------------------------+

El paso comodín pasó por todos los objetos y seleccionó los valores de su name miembros.

En este caso, podríamos haber conseguido el mismo resultado con otro selector. El selector de comodín de matriz nos habría ayudado a obtener el mismo 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"] |
+------------------------------------+

Mismo resultado.

Sin embargo, la cosa cambia si usamos un documento diferente.

Ejemplo 2

En el siguiente ejemplo, obtenemos un resultado diferente entre el paso comodín y el selector 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.

Los resultados obviamente dependerán del documento y la construcción real de la expresión JSONPath, y los selectores utilizados dependerán de sus requisitos.

Una cosa para recordar es que el paso comodín no debe ser el último paso en la expresión JSONPath. Debe ir seguido de un paso de selector de miembro de matriz o de objeto.

Ejemplo 3

Aquí hay un ejemplo que devuelve el segundo elemento de la matriz de todas las matrices llamadas sizes , incluidas las matrices anidadas en otros 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"]           |
+-------------------------------------+

Las matrices están basadas en cero, por lo que $**.sizes[1] se refiere al segundo elemento en todos los sizes matrices.