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.