it-swarm.com.de

Ist es möglich, JSON in SQLite zu speichern und abzufragen?

Ich muss JSON-Objekte in einer SQLite-Datenbank speichern und dann komplexe Abfragen durchführen.

Ich habe einen Tisch wie diesen gemacht:

+--------------------------------------+
|document |  property | string | number|
+--------------------------------------+
|foo      |  "title"  | "test" |       | 
+--------------------------------------+
|foo      |  "id"     |        |  42   | 
+--------------------------------------+
|bar      |  "id"     |        |  43   | 
+--------------------------------------+

für die beiden Objekte

foo {"title": "test", "id": 42} 
bar {id: 43}

Aber ich kann keine "UND" -Abfragen machen, wie:

SELECT DISTINCT id  FROM table WHERE title = "test" AND id = 42 

wie Sie sehen, ist der Teil nach dem "WO" totaler Unsinn, aber ich habe keine Ahnung, wie ich eine Abfrage erstellen soll, die das tut, was ich will.

Glauben Sie also, dass es eine bessere Möglichkeit gibt, meine Daten zu speichern, oder eine Problemumgehung, um eine "UND" -Abfrage durchzuführen?

Und natürlich kann JSON jede Eigenschaft enthalten, sodass ich nicht für jede Eigenschaft eine Tabelle mit Spalten erstellen kann.

Ich verwende WebSQL, SQLite ohne Erweiterungen.

Ich weiß, dass meine Frage ziemlich spezifisch ist, aber können Sie mir helfen?

36
tuxlu

In SQLite 3.9 wurde eine neue Erweiterung ( JSON1 ) eingeführt, mit der Sie problemlos mit JSON-Daten arbeiten können.

Außerdem wurde die Unterstützung für Indizes für Ausdrücke eingeführt, mit denen Sie (nach meinem Verständnis) auch Indizes für Ihre JSON-Daten definieren können.

41
ThePhysicist

PostgreSQL hat einige nette Funktionen für den JSON-Speicher. Sie können die JSON-Werte auswählen, indem Sie dies tun

SELECT DISTINCT FROM TABLE WHERE foo->title=test AND id=42

Sie können die spezifischen Schlüssel auch für das JSON-Objekt indizieren, wenn Sie den Typ jsonb verwenden.

8

Die vorhandenen Antworten für dieses Problem beziehen sich auf das tatsächliche Speichern der OP-Daten als JSON (was möglicherweise eine bessere Lösung für sein zugrunde liegendes Problem war).

Die eigentliche Frage war jedoch, wie Dokumente in der bereitgestellten Tabelle im EAV-Stil basierend auf mehreren Eigenschaften gefunden werden können. Vielleicht wäre eine Antwort auf diese Frage nützlich.

Die Standard-SQL-Methode für das, was Sie sagen, ist INTERSECTION.

(SELECT document FROM table WHERE property="id" AND number=43)
INTERSECTION 
(SELECT document FROM table WHERE property="title" AND string="test")

Sie können dies auch mit Self-Joins tun, wenn Sie dies bevorzugen.

SELECT t1.document
FROM table as t1, table as t2
WHERE t1.document = t2.document
AND t1.property="id" AND t1.number=43
AND t2.property="title" AND t2.string="test"

Der "korrektere" und wohl effizienteste Weg wäre natürlich, einfach eine Spalte für jede Eigenschaft zu erstellen, die Sie benötigen, wie "id" und "title".

5
Thomas Ahle