MariaDB
 sql >> Database >  >> RDS >> MariaDB

Come funziona il passaggio con caratteri jolly JSONPath (**) in MariaDB

Quando si lavora con JSON in MariaDB, è possibile utilizzare le espressioni JSONPath per manipolare i dati all'interno di un documento JSON.

Una potente funzionalità fornita da MariaDB è il passaggio con caratteri jolly (** ). Ciò ti consente di selezionare ricorsivamente tutti gli elementi figlio dell'elemento corrente.

Il passaggio con caratteri jolly è un'estensione non standard ed è supportato anche con lo stesso significato in MySQL.

Esempio

Ecco un esempio da dimostrare:

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

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

Risultato:

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

Il passaggio con caratteri jolly ha esaminato tutti gli oggetti e selezionato i valori dal loro name membri.

In questo caso avremmo potuto ottenere lo stesso risultato con un altro selettore. Il selettore di caratteri jolly dell'array ci avrebbe aiutato a ottenere lo stesso risultato:

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

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

Risultato:

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

Stesso risultato.

Tuttavia, le cose cambiano se utilizziamo un documento diverso.

Esempio 2

Nell'esempio seguente, otteniamo un risultato diverso tra il passaggio con caratteri jolly e il selettore di array:

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

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

Risultato:

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

Risultato diverso.

I risultati dipenderanno ovviamente dal documento e dall'effettiva costruzione dell'espressione JSONPath e i selettori utilizzati dipenderanno dalle tue esigenze.

Una cosa da ricordare è che il passaggio con caratteri jolly non deve essere l'ultimo passaggio nell'espressione JSONPath. Deve essere seguito da un passaggio di selezione del membro di matrice o oggetto.

Esempio 3

Ecco un esempio che restituisce il secondo elemento dell'array da tutti gli array chiamati sizes , inclusi gli array nidificati all'interno di altri documenti:

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

Risultato:

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

Gli array sono a base zero e quindi $**.sizes[1] si riferisce al secondo elemento in tutte le sizes matrici.