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

Hvordan JSONPath Wildcard Trin (**) fungerer i MariaDB

Når du arbejder med JSON i MariaDB, kan du bruge JSONPath-udtryk til at manipulere data i et JSON-dokument.

En kraftfuld funktion, som MariaDB tilbyder, er jokertegntrinnet (** ). Dette giver dig mulighed for rekursivt at vælge alle underordnede elementer af det aktuelle element.

Jokertegntrinnet er en ikke-standardudvidelse, og det understøttes også med samme betydning i MySQL.

Eksempel

Her er et eksempel til demonstration:

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

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

Resultat:

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

Jokertegntrinnet gik gennem alle objekter og valgte værdierne fra deres name medlemmer.

I dette tilfælde kunne vi have opnået det samme resultat med en anden vælger. Array-jokertegnvælgeren ville have hjulpet os med at få det samme resultat:

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

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

Resultat:

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

Samme resultat.

Men tingene ændrer sig, hvis vi bruger et andet dokument.

Eksempel 2

I det følgende eksempel får vi et andet resultat mellem jokertegntrinnet og matrixvælgeren:

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

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

Resultat:

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

Anderledes resultat.

Resultaterne vil naturligvis afhænge af dokumentet og den faktiske konstruktion af JSONPath-udtrykket, og de anvendte vælgere vil afhænge af dine krav.

En ting at huske er, at jokertegntrinnet ikke må være det sidste trin i JSONPath-udtrykket. Det skal efterfølges af et array- eller objektmedlemsvælgertrin.

Eksempel 3

Her er et eksempel, der returnerer det andet array-element fra alle arrays kaldet sizes , inklusive arrays, der er indlejret i andre dokumenter:

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

Resultat:

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

Arrays er nul-baserede og derfor $**.sizes[1] henviser til det andet element i alle sizes arrays.


  1. PARTITION BY med og uden KEEP i Oracle

  2. Sådan laver du en inventardatabase om adgang

  3. Sådan installeres, sikres og ydeevneindstilling af MariaDB-databaseserveren

  4. Sådan bruger du UPDATE fra SELECT i SQL Server