是否可以在SQLite中存储和查询JSON?


35

我需要将JSON对象存储在SQLite数据库中,然后对它进行复杂的查询。

我做了一个这样的表:

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

对于两个对象

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

但是我无法执行“ AND”查询,例如:

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

如您所见,“ WHERE”后面的部分完全是胡说八道,但是我不知道如何创建可以满足我需要的查询。

那么,您是否认为有更好的方法来存储我的数据,或者是解决“ AND”查询的方法?

当然,JSON可以包含任何属性,因此我无法为每个属性创建带有列的表。

我正在使用WebSQL,这是没有扩展的SQLite。

我知道我的问题很具体,但是您能帮我吗?


2
如果这对于您的应用程序确实很重要,那么最好使用真实的文档存储(“ NoSQL”)或切换到Postgres,后者结合了非常高效的JSON存储和强大的关系功能。
a_horse_with_no_name 2015年

3
阅读文档
CL。

@CL。是的 这也是谷歌搜索“ sqlite json”时的第一个结果:)
Izzy 2015年


@Izzy首先,对我而言,至少这个问题现在是第一个结果,而不是文档。其次,该扩展名不是OP的好答案,OP明确声明使用“ WebSQL,这是没有扩展名的SQLite”。
OJFord

Answers:


35

SQLite 3.9引入了一个新扩展(JSON1),使您可以轻松使用JSON数据。

此外,它引入了对表达式索引的支持(据我所知),这也应允许您在JSON数据上定义索引。


7

PostgreSQL有一些不错的JSON存储功能。您可以通过以下方式选择JSON值:

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

如果使用jsonb类型,还可以索引JSON对象上的特定键。


5

解决此问题的现有方法是将OP的数据实际存储为JSON(这可能是解决其潜在问题的更好方法)。

但是,实际的问题是如何基于多个属性在提供的EAV样式表中查找文档。因此,也许对该问题的答案将是有用的。

执行SQL的标准方法是INTERSECTION。

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

如果愿意,您也可以使用自连接进行此操作。

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"

当然,更“正确”且可以说是最有效的方法是为所需的每个属性(例如“ id”和“ title”)创建一列。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.