sql >> Database >  >> RDS >> MariaDB

Hoe de JSONPath-wildcardstap (**) werkt in MariaDB

Wanneer u met JSON in MariaDB werkt, kunt u JSONPath-expressies gebruiken om gegevens in een JSON-document te manipuleren.

Een krachtige functie die MariaDB biedt, is de stap met jokertekens (** ). Hiermee kunt u recursief alle onderliggende elementen van het huidige element selecteren.

De wildcard-stap is een niet-standaard extensie en wordt ook met dezelfde betekenis ondersteund in MySQL.

Voorbeeld

Hier is een voorbeeld om te demonstreren:

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

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

Resultaat:

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

De wildcard-stap doorliep alle objecten en selecteerde de waarden uit hun name leden.

In dit geval hadden we hetzelfde resultaat kunnen bereiken met een andere selector. De array-wildcardselector zou ons hebben geholpen om hetzelfde resultaat te krijgen:

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

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

Resultaat:

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

Zelfde resultaat.

De dingen veranderen echter als we een ander document gebruiken.

Voorbeeld 2

In het volgende voorbeeld krijgen we een ander resultaat tussen de jokerstap en de arraykiezer:

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

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

Resultaat:

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

Ander resultaat.

De resultaten zijn uiteraard afhankelijk van het document en de feitelijke constructie van de JSONPath-expressie, en de gebruikte selectors zijn afhankelijk van uw vereisten.

Een ding om te onthouden is dat de stap met jokertekens niet de laatste stap in de JSONPath-expressie mag zijn. Het moet worden gevolgd door een stap voor het selecteren van een array of objectlid.

Voorbeeld 3

Hier is een voorbeeld dat het tweede array-element retourneert van alle arrays genaamd sizes , inclusief arrays die in andere documenten zijn genest:

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

Resultaat:

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

Arrays zijn gebaseerd op nul en dus $**.sizes[1] verwijst naar het tweede element in alle sizes arrays.


  1. Postgres-functie NULL-waarde voor rij die verwijst naar NEW

  2. Oracle:Combineer meerdere resultaten in een subquery tot één door komma's gescheiden waarde

  3. Re-Slaven van een gecrashte MySQL-masterserver in semisynchrone replicatieconfiguratie

  4. Ormlite of sqlite Welke is goed voor Android-perspectief?