我做了一个这样的表:
+--------------------------------------+
|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。
我知道我的问题很漂亮具体,但您能帮我吗?
#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”。
评论
如果这对于您的应用程序确实很重要,那么最好使用真实的文档存储区(“ 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”。