MariaDB
 sql >> Datenbank >  >> RDS >> MariaDB

So geben Sie Elemente aus einem JSON-Array in MariaDB zurück

MariaDB enthält zwei Selektoren, mit denen wir Elemente aus JSON-Arrays auswählen können:

  • [N] wählt die Elementnummer N aus im Array (zum Beispiel [0] um das erste Element auszuwählen).
  • [*] wählt alle Elemente im Array aus.

Diese können in einer Reihe von JSON-Funktionen verwendet werden, die in MariaDB enthalten sind. Die folgenden Beispiele verwenden sie mit JSON_EXTRACT() Funktion, um ausgewählte Array-Elemente zurückzugeben.

Beispiel – [N]

Hier ist ein einfaches Beispiel, um zu demonstrieren, wie man ein einzelnes Array-Element auswählt:

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

Ergebnis:

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

Arrays sind nullbasiert, also $[1] wählt das zweite Array-Element aus.

Hier ist ein weiteres Beispiel, diesmal mit einem etwas größeren JSON-Dokument:

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

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

Ergebnis:

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

In diesem Fall .sizes gibt die sizes an Objektmitglied, und so $.sizes[1] wählt das zweite Element in den sizes aus Array.

Beispiel- [*]

Der [*] Selektor wählt alle Elemente im Array aus.

Beispiel:

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

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

Ergebnis:

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

In diesem Fall sieht das Ergebnis genauso aus wie das ursprüngliche Array, in diesem Fall hätte es einfach durch Angabe von $.sizes zurückgegeben werden können .

Mehrere Array-Selektoren

Aber hier ist ein weiteres Beispiel, das zwei Array-Selektoren verwendet.

Zuerst verwenden wir einen Wildcard-Selektor, um alle Elemente im Array auszuwählen. Dann verwenden wir einen anderen Array-Selektor, um nur das zweite Element in einem Array auszuwählen, das in diesen Elementen verschachtelt ist:

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

Ergebnis:

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

Platzhalterschritt

Wenn Ihr JSON-Dokument mehrere Arrays mit demselben Namen enthält, von denen einige auf verschiedenen Ebenen oder in einem eigenen Objekt verschachtelt sind, können Sie sie alle mit Hilfe des Platzhalterschritts (** ). Der Platzhalterschritt wählt rekursiv alle untergeordneten Elemente des aktuellen Elements aus.

Hier verwenden wir es, um beim Erstellen eines JSONPath-Ausdrucks zu helfen, der das zweite Array-Element aus allen Arrays namens sizes zurückgibt , einschließlich Arrays, die in anderen Dokumenten verschachtelt sind:

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

Ergebnis:

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