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

35

Ich muss JSON-Objekte in einer SQLite-Datenbank speichern und dann komplexe Abfragen ausfü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 macht, was ich will.

Gibt es Ihrer Meinung nach eine bessere Möglichkeit, meine Daten zu speichern, oder eine Problemumgehung, um eine UND-Abfrage durchzuführen?

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

Ich benutze WebSQL, das SQLite ohne Erweiterungen ist.

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

Tuxlu
quelle
2
Wenn das für Ihre Anwendung wirklich wichtig ist, ist es wahrscheinlich besser, einen echten Dokumentenspeicher ("NoSQL") zu verwenden oder z. B. zu Postgres zu wechseln, der sehr effizienten JSON-Speicher mit starken relationalen Funktionen kombiniert.
a_horse_with_no_name
3
Lesen Sie die Dokumentation .
CL.
@CL. Yupp. Das ist auch das erste Ergebnis beim googeln nach "sqlite json" :)
Izzy
Sie müssen Konten erstellen und diese zusammenführen: dba.stackexchange.com/users/81459/tuxlu und dba.stackexchange.com/users/81513/tuxlu Sie können diese Hilfeseite verwenden
Julien Vavasseur
@ Izzy Zunächst einmal ist für mich zumindest diese Frage jetzt das erste Ergebnis, nicht die Dokumentation. Zweitens ist diese Erweiterung keine gute Antwort für OP, das explizit angegeben hat, 'WebSQL, das SQLite ohne Erweiterungen ist' zu verwenden.
OJFord

Antworten:

35

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 von Indizes für Ausdrücke eingeführt , mit denen Sie (nach meinem Verständnis) auch Indizes für Ihre JSON-Daten definieren können.

ThePhysicist
quelle
7

PostgreSQL bietet einige nützliche Funktionen für den JSON-Speicher. Sie können die JSON-Werte auf diese Weise auswählen

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

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

redneckProgrammer
quelle
5

Die vorhandenen Antworten zu diesem Thema beziehen sich auf das 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 auf der Grundlage mehrerer Eigenschaften Suchdokumente in der bereitgestellten EAV-Tabelle abgerufen 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 vorziehen.

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"

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

Thomas Ahle
quelle