Est-il possible de stocker et d'interroger JSON dans SQLite?

35

Je dois stocker des objets JSON dans une base de données SQLite, puis effectuer des requêtes complexes à ce sujet.

J'ai fait un tableau comme ça:

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

pour les deux objets

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

Mais je ne peux pas faire de requêtes "ET", comme:

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

comme vous le voyez, la partie après "WHERE" est un non-sens total, mais je ne sais pas comment créer une requête qui ferait ce que je veux.

Alors, pensez-vous qu'il existe un meilleur moyen de stocker mes données ou une solution de contournement pour effectuer une requête "AND"?

Et bien sûr, le JSON peut contenir n'importe quelle propriété, je ne peux donc pas créer de table avec des colonnes pour chaque propriété.

J'utilise WebSQL, qui est SQLite sans extensions.

Je sais que ma question est assez précise, mais pourriez-vous m'aider?

tuxlu
la source
2
Si cela est vraiment important pour votre application, il vaut probablement mieux utiliser un vrai magasin de documents ("NoSQL") ou, par exemple, passer à Postgres, qui associe un stockage JSON très efficace à des fonctions relationnelles puissantes.
a_horse_with_no_name
3
Lisez la documentation .
CL.
@CL. Yupp. C'est aussi le premier résultat quand on recherche Google pour "sqlite json" :)
Izzy
Vous devez créer des comptes et les fusionner: dba.stackexchange.com/users/81459/tuxlu et dba.stackexchange.com/users/81513/tuxlu Vous pouvez utiliser cette page d'aide: dba.stackexchange.com/help/merging-accounts
Julien Vavasseur
@ Izzy Tout d'abord, pour moi au moins cette question est maintenant le premier résultat, pas la documentation. Deuxièmement, cette extension n'est pas une bonne réponse pour OP, qui a explicitement déclaré d'utiliser «WebSQL, qui est SQLite sans extensions».
OJFord

Réponses:

35

SQLite 3.9 a introduit une nouvelle extension ( JSON1 ) qui vous permet de travailler facilement avec des données JSON.

En outre, il introduisait la prise en charge des index sur les expressions , ce qui devrait (selon ma compréhension) également vous permettre de définir des index sur vos données JSON.

Le médecin
la source
7

PostgreSQL a quelques fonctionnalités intéressantes pour le stockage JSON. Vous pouvez sélectionner les valeurs JSON en faisant

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

Vous pouvez également indexer les clés spécifiques sur l'objet JSON si vous utilisez le jsonbtype.

RedneckProgrammer
la source
5

Les réponses existantes à ce problème consistent à stocker les données du PO sous forme de JSON (ce qui aurait pu être une meilleure solution à son problème sous-jacent).

Cependant, la vraie question était de savoir comment obtenir des documents trouvés dans la table de style EAV fournie, en fonction de plusieurs propriétés. Alors, peut-être une réponse à cette question serait utile.

INTERSECTION est la méthode standard utilisée par SQL pour faire ce que vous dites.

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

Vous pouvez également le faire avec des auto-jointes si vous préférez.

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"

Bien sûr, le moyen le plus "correct" et sans doute le plus efficace serait de créer une colonne pour chaque propriété dont vous avez besoin, comme "id" et "titre".

Thomas Ahle
la source