MariaDB
 sql >> Base de données >  >> RDS >> MariaDB

Fonctionnement de l'étape JSONPath Wildcard (**) dans MariaDB

Lorsque vous travaillez avec JSON dans MariaDB, vous pouvez utiliser des expressions JSONPath pour manipuler des données dans un document JSON.

Une fonctionnalité puissante fournie par MariaDB est l'étape générique (** ). Cela vous permet de sélectionner de manière récursive tous les éléments enfants de l'élément actuel.

L'étape générique est une extension non standard, et elle est également prise en charge avec la même signification dans MySQL.

Exemple

Voici un exemple pour illustrer :

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

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

Résultat :

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

L'étape générique a parcouru tous les objets et sélectionné les valeurs à partir de leur name membres.

Dans ce cas, nous aurions pu obtenir le même résultat avec un autre sélecteur. Le sélecteur de tableau générique nous aurait permis d'obtenir le même résultat :

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

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

Résultat :

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

Même résultat.

Cependant, les choses changent si nous utilisons un document différent.

Exemple 2

Dans l'exemple suivant, nous obtenons un résultat différent entre l'étape générique et le sélecteur de tableau :

SET @json = '[
    { 
        "name" : "Homer", 
        "pets" : [
            { 
            "name" : "Wag",
            "type" : "Dog"
            },
            { 
            "name" : "Scratch",
            "type" : "Cat"
            }
        ]    
    }
]';

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

Résultat :

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

Résultat différent.

Les résultats dépendront évidemment du document et de la construction réelle de l'expression JSONPath, et les sélecteurs utilisés dépendront de vos besoins.

Une chose à retenir est que l'étape générique ne doit pas être la dernière étape dans l'expression JSONPath. Il doit être suivi d'une étape de sélection de membre de tableau ou d'objet.

Exemple 3

Voici un exemple qui renvoie le deuxième élément de tableau de tous les tableaux appelés sizes , y compris les tableaux imbriqués dans d'autres documents :

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]');

Résultat :

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

Les tableaux sont basés sur zéro et donc $**.sizes[1] fait référence au deuxième élément dans toutes les sizes tableaux.