sql >> Databasteknik >  >> RDS >> MariaDB

Hur JSONPath Wildcard-steget (**) fungerar i MariaDB

När du arbetar med JSON i MariaDB kan du använda JSONPath-uttryck för att manipulera data i ett JSON-dokument.

En kraftfull funktion som MariaDB tillhandahåller är jokerteckensteget (** ). Detta låter dig välja rekursivt alla underordnade element till det aktuella elementet.

Jokerteckensteget är ett icke-standardiserat tillägg, och det stöds också med samma betydelse i MySQL.

Exempel

Här är ett exempel att visa:

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

Jokerteckensteget gick igenom alla objekt och valde värdena från deras name medlemmar.

I det här fallet kunde vi ha uppnått samma resultat med en annan väljare. Array-jokerteckenväljaren skulle ha hjälpt oss att få samma 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"] |
+------------------------------------+

Samma resultat.

Men saker och ting förändras om vi använder ett annat dokument.

Exempel 2

I följande exempel får vi ett annat resultat mellan jokerteckensteget och arrayväljaren:

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

Annat resultat.

Resultaten kommer uppenbarligen att bero på dokumentet och den faktiska konstruktionen av JSONPath-uttrycket, och de väljare som används beror på dina krav.

En sak att komma ihåg är att jokerteckensteget inte får vara det sista steget i JSONPath-uttrycket. Det måste följas av ett array- eller objektmedlemsväljarsteg.

Exempel 3

Här är ett exempel som returnerar det andra arrayelementet från alla arrayer som kallas sizes , inklusive matriser som är kapslade i andra dokument:

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

Arrayer är nollbaserade och så $**.sizes[1] hänvisar till det andra elementet i alla sizes arrayer.


  1. Kan inte lösa sorteringskonflikten mellan SQL_Latin1_General_CP1_CI_AS och Latin1_General_CI_AS i lika med operationen

  2. Hur returnerar jag flera resultatuppsättningar med SqlCommand?

  3. ADDM på SearchOracle.com

  4. Oracle:hur man infogar om en rad inte finns