SQLite
 sql >> Datenbank >  >> RDS >> SQLite

3 Möglichkeiten zum Extrahieren eines Werts aus einem JSON-Dokument in SQLite

Bei der Verwendung von SQLite können wir die folgenden Methoden verwenden, um Daten aus einem JSON-Dokument zu extrahieren.

Der json_extract() Funktion

Wie der Name schon sagt, ist der json_extract() Funktion extrahiert und gibt einen oder mehrere Werte aus wohlgeformtem JSON zurück.

Beispiel:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1]'
);

Ergebnis:

{"name":"Bark","scores":[3,4,8,7]}

Arrays sind nullbasiert, daher beginnt die Zählung bei 0 . Daher haben wir [1][code> angegeben um das zweite Element innerhalb der dogs zu erhalten Array, das zufällig ein JSON-Objekt ist.

Wir können nur den Namen des Hundes an dieser Position im Array zurückgeben, indem wir zu unserem Pfad hinzufügen:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[1].name'
);

Ergebnis:

Bark

Wir können json_extract() verwenden um mehrere Pfade zurückzugeben:

SELECT json_extract('{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}', 
'$.dogs[0].name',
'$.dogs[1].name',
'$.dogs[2].name'
);

Ergebnis:

["Wag","Bark","Woof"]

Wenn wir Werte aus mehreren Pfaden extrahieren, werden die Werte in einem Array zurückgegeben.

Der -> Betreiber

Der -> -Operator extrahiert eine Unterkomponente aus einem JSON-Dokument und gibt eine JSON-Darstellung dieser Unterkomponente zurück.

Daher können wir das erste Beispiel wie folgt ändern:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1]';

Ergebnis:

{"name":"Bark","scores":[3,4,8,7]}

Der -> Operator unterscheidet sich geringfügig von json_extract() Funktion:

  • Der -> -Operator gibt immer eine JSON-Darstellung der Unterkomponente zurück.
  • Der json_extract() Die Funktion gibt JSON nur zurück, wenn zwei oder mehr Pfadargumente vorhanden sind (da das Ergebnis dann ein JSON-Array ist) oder wenn das einzelne Pfadargument auf ein Array oder Objekt verweist.
  • Wenn es nur ein Pfadargument gibt und dieser Pfad auf eine JSON-Null oder einen String oder einen numerischen Wert verweist, dann json_extract() gibt den entsprechenden SQL-NULL-, TEXT-, INTEGER- oder REAL-Wert zurück.

Daher passiert Folgendes, wenn wir den Namen eines Hundes aus unserem JSON extrahieren:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' -> '$.dogs[1].name';

Ergebnis:

"Bark"

Diesmal ist es von Anführungszeichen umgeben. Das liegt daran, dass es eine JSON-Darstellung des Werts zurückgegeben hat. Als wir denselben Wert mit json_extract() extrahiert haben zuvor haben wir eine SQL-Darstellung des Werts erhalten.

Wir können aber auch den ->> verwenden Operator, um eine SQL-Darstellung zurückzugeben.

Der ->> Betreiber

Der ->> Operator funktioniert genauso wie -> -Operator, außer dass ->> gibt eine SQL-Darstellung der angegebenen Unterkomponente zurück. Insbesondere gibt es einen SQL TEXT zurück , INTEGER , ECHT , oder NULL Wert, der die ausgewählte Unterkomponente darstellt, oder NULL wenn die Unterkomponente nicht existiert.

Daher passiert Folgendes, wenn wir ->> verwenden Operator, um den Namen des Hundes zu extrahieren:

SELECT '{
    "dogs" : [
            { "name" : "Wag", "scores" : [ 7, 9 ] },
            { "name" : "Bark", "scores" : [ 3, 4, 8, 7 ] },
            { "name" : "Woof", "scores" : [ 3, 2, 1 ] }
    ]
}' ->> '$.dogs[1].name';

Ergebnis:

Bark

Es wird nicht mehr in Anführungszeichen gesetzt.