sql >> Databasteknik >  >> RDS >> MariaDB

Hur man returnerar element från en JSON-array i MariaDB

MariaDB innehåller två väljare som gör det möjligt för oss att välja element från JSON-arrayer:

  • [N] väljer elementnummer N i arrayen (till exempel [0] för att välja det första elementet).
  • [*] väljer alla element i arrayen.

Dessa kan användas i ett antal JSON-funktioner som ingår i MariaDB. Följande exempel använder dem med JSON_EXTRACT() funktion för att returnera valda arrayelement.

Exempel – [N]

Här är ett enkelt exempel för att visa hur man väljer ett enstaka arrayelement:

SELECT JSON_EXTRACT('[1,2,3]', '$[1]');

Resultat:

+---------------------------------+
| JSON_EXTRACT('[1,2,3]', '$[1]') |
+---------------------------------+
| 2                               |
+---------------------------------+

Arrayer är nollbaserade, och så $[1] väljer det andra matriselementet.

Här är ett annat exempel, den här gången med ett lite större JSON-dokument:

SET @json = '
    { 
        "_id": 1, 
        "product": "Left Handed Screwdriver", 
        "sizes": [ "S", "M", "L" ] 
    }
';

SELECT JSON_EXTRACT(@json, '$.sizes[1]');

Resultat:

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

I det här fallet, .sizes anger sizes objektmedlem, och så $.sizes[1] väljer det andra objektet i sizes array.

Exempel- [*]

[*] selector väljer alla element i arrayen.

Exempel:

SET @json = '
    { 
        "_id": 1, 
        "product": "Left Handed Screwdriver", 
        "sizes": [ "S", "M", "L" ] 
    }
';

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

Resultat:

+-----------------------------------+
| JSON_EXTRACT(@json, '$.sizes[*]') |
+-----------------------------------+
| ["S", "M", "L"]                   |
+-----------------------------------+

I det här fallet ser resultatet exakt likadant ut som den ursprungliga arrayen, i så fall kunde det ha returnerats bara genom att ange $.sizes .

Flera matrisväljare

Men här är ett annat exempel som använder två arrayväljare.

Först använder vi en jokerteckenväljare för att välja alla element i arrayen. Sedan använder vi en annan arrayväljare för att bara välja det andra elementet i en array som är kapslad i dessa element:

SET @json = '
{ 
    "products" : 
    [
        { 
            "_id": 1, 
            "product": "Left Handed Screwdriver", 
            "sizes": [ "S", "M", "L" ] 
        },
        { 
            "_id": 2, 
            "product": "Long Weight", 
            "sizes": [ 8, 7, 10 ] 
        },
        { 
            "_id": 3, 
            "product": "Bottomless Coffee Cup", 
            "sizes": [ "Tall", "Grande", "Venti" ] 
        }
    ]
}
';

SELECT JSON_EXTRACT(@json, '$.products[*].sizes[1]');

Resultat:

+-----------------------------------------------+
| JSON_EXTRACT(@json, '$.products[*].sizes[1]') |
+-----------------------------------------------+
| ["M", 7, "Grande"]                            |
+-----------------------------------------------+

Jokerteckensteg

Om ditt JSON-dokument innehåller flera arrayer med samma namn, några kapslade på olika nivåer eller i sitt eget objekt, kan du välja dem alla med hjälp av jokerteckensteget (** ). Jokerteckensteget väljer rekursivt alla underordnade element i det aktuella elementet.

Här använder vi det för att bygga ett JSONPath-uttryck 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"]           |
+-------------------------------------+

  1. De tre främsta anledningarna till att folk flyttar till SaaS

  2. SQL Alias ​​förklarat

  3. kan vi ha en främmande nyckel som inte är en primärnyckel i någon annan tabell?

  4. Kan inte hitta vare sig kolumn dbo eller den användardefinierade funktionen eller aggregerad dbo.Splitfn, eller så är namnet tvetydigt