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

SQLite JSON_EXTRACT()

In SQLite der json_extract() Funktion extrahiert und gibt einen oder mehrere Werte aus wohlgeformtem JSON zurück.

Wir übergeben das JSON als Argument, wenn wir die Funktion aufrufen, und es gibt den/die zutreffenden Wert/e zurück.

Wir können einen oder mehrere Pfade angeben, die aus dem JSON-Dokument extrahiert werden sollen.

Syntax

Die Syntax lautet wie folgt:

json_extract(X,P1,P2,...)

Wobei X stellt das JSON-Dokument dar und P1,P2,... sind Pfade, die wir verwenden können, um bestimmte Teile des JSON-Dokuments zu extrahieren.

Beispiele

Hier ist ein einfaches Beispiel zur Veranschaulichung:

SELECT json_extract('{ "a" : 1 }', '$');

Ergebnis:

{"a":1}

Hier habe ich einen Pfad von $ angegeben , die das gesamte JSON-Dokument zurückgibt.

Hier ist ein Beispiel mit einem größeren JSON-Dokument:

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

Ergebnis:

{"dogs":[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]}

Ändern wir den Pfad so, dass wir nur die Hunde zurückgeben Array:

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

Ergebnis:

[{"name":"Wag","scores":[7,9]},{"name":"Bark","scores":[3,4,8,7]},{"name":"Woof","scores":[3,2,1]}]

Lassen Sie uns eines der Elemente innerhalb des Arrays auswählen:

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.

Lassen Sie uns noch einmal tiefer gehen und nur den Namen des Hundes an dieser Position im Array zurückgeben:

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

Mehrere Pfade angeben

Der json_extract() Funktion ermöglicht es uns, mehrere Pfade auszuwählen:

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

In diesem Fall habe ich die Namen aller Hunde in dogs zurückgegeben Array.

Alle Hundenamen werden in einem Array zurückgegeben.

Auswählen eines nicht vorhandenen Pfads

Wenn wir auf einen Pfad zeigen, der nicht existiert, null zurückgegeben wird.

Lassen Sie uns zuerst .nullvalue festlegen auf NULL :

.nullvalue NULL

Der .nullvalue Der dot-Befehl ermöglicht es uns, eine Zeichenfolge bereitzustellen, die zum Ersetzen von Nullwerten verwendet wird. Dies ist eine von mehreren Möglichkeiten, wie Sie Nullwerte in SQLite durch eine Zeichenfolge ersetzen können. In diesem Fall setze ich es auf NULL . Jetzt geben alle Nullwerte NULL zurück anstelle eines leeren Ergebnisses.

Rufen wir nun json_extract() auf , aber verwenden Sie ein zweites Argument, das auf einen nicht existierenden Pfad zeigt:

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

Ergebnis:

NULL

Ungültige Pfade

Wir erhalten eine Fehlermeldung, wenn unser Pfad nicht wohlgeformt ist:

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

Ergebnis:

Runtime error: JSON path error near 'dogs'

In diesem Fall habe ich vergessen, $. einzufügen am Anfang des Weges.

Ungültige JSON-Dokumente

Außerdem erhalten wir eine Fehlermeldung, dass JSON nicht wohlgeformt ist:

SELECT json_extract('{ "Dogs" : }', 
'$'
);

Ergebnis:

Runtime error: malformed JSON

Diesmal sagt uns der Fehler, dass unser JSON fehlerhaft ist.

Rückgabetypen

Die SQLite-Dokumentation besagt Folgendes:

Wenn nur ein einzelner Pfad P1 angegeben wird, dann ist der SQL-Datentyp des Ergebnisses NULL für eine JSON-Null, INTEGER oder REAL für einen numerischen JSON-Wert, eine INTEGER-Null für einen falschen JSON-Wert, eine INTEGER-Eins für einen wahren JSON-Wert. der dequotierte Text für einen JSON-String-Wert und eine Textdarstellung für JSON-Objekt- und Array-Werte. Wenn mehrere Pfadargumente (P1, P2 usw.) vorhanden sind, gibt diese Routine SQLite-Text zurück, bei dem es sich um ein wohlgeformtes JSON-Array handelt, das die verschiedenen Werte enthält.

MySQL-Kompatibilität

Die SQLite-Dokumentation warnt uns auch vor einer subtilen Inkompatibilität zwischen den SQLite- und MySQL-Implementierungen von json_extract() Funktion.

Konkret heißt es:

Die MySQL-Version von json_extract() gibt immer JSON zurück. Die SQLite-Version von json_extract() gibt JSON nur zurück, wenn zwei oder mehr PATH-Argumente vorhanden sind (weil das Ergebnis dann ein JSON-Array ist) oder wenn das einzelne PATH-Argument auf ein Array oder Objekt verweist. Wenn in SQLite json_extract() nur ein einziges PATH-Argument hat und dieser PATH auf eine JSON-Null oder einen String oder einen numerischen Wert verweist, dann gibt json_extract() den entsprechenden SQL-NULL-, TEXT-, INTEGER- oder REAL-Wert zurück.

Dieser Unterschied wird im Grunde nur beim Zugriff auf einzelne Werte innerhalb des JSON sichtbar, die Strings oder NULLs sind.