我需要将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。

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

评论

如果这对于您的应用程序确实很重要,那么最好使用真实的文档存储区(“ NoSQL”)或例如切换到将高效的JSON存储与强大的关系功能结合在一起的Postgres。

阅读文档。

@CL。是的这也是在搜索“ sqlite json”时的第一个结果:)

您必须要帐户并且应该合并它们:dba.stackexchange.com/users/81459/tuxlu和dba.stackexchange.com/users/81513/tuxlu可以使用此帮助页面:dba.stackexchange.com/help/merging-accounts

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

#1 楼

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

此外,它还引入了对表达式索引的支持,据我所知,它应允许您在您的JSON数据也是如此。

#2 楼

PostgreSQL有一些不错的JSON存储功能。您可以执行以下操作来选择JSON值:

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


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

评论


在2020+的这些天中,Sqlite3中有与此等效的1:1吗?

–尼克·斯威汀(Nick Sweeting)
20年6月19日在7:53

不回答OP问题...不是关于PG

–mattdlockyer
20 Sep 15 '23:00

您是否认为OP可能已经在生产中使用Postgres并想模仿PSQL的测试功能?

– jdkealy
20 Sep 25 '22:27

#3 楼

解决此问题的现有方法是将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”。