我有一个SQLite数据库,其中包含一个带有文本列的表。在此列中,我存储了一个JSON字符串数组。
这是表格,缩短为仅包含相关内容:
CREATE TABLE "recipePreview" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"name" TEXT NOT NULL, "intro" TEXT,
"tags" TEXT
)
一些示例数据(手写内容可能包含语法错误...):
INSERT INTO recipePreview (id, name, tags) VALUES (NULL, "My recipe", '["glutenFree","raw","naturallySweetened","vegan"]')
INSERT INTO recipePreview (id, name, tags) VALUES (NULL, "My other recipe", '["aquafaba","glutenFree","vegan"]')
我想根据tags
列中JSON数组的内容过滤这些行。例如;该查询返回所有用raw
标记的食谱。我可以使用以下查询来做到这一点:
SELECT * FROM recipePreview, json_tree(recipePreview.tags, '$')
WHERE value = "a tag"
我无法弄清楚的是,是否有办法在我的AND
子句中有一个WHERE
。就是看起来像这样的东西:
SELECT * FROM articles, json_tree(recipePreview.tags, '$')
WHERE value = "a tag" AND value = "another tag"
我不想只是做一个字符串比较(使用LIKE
),因为一个标签可能包含另一个标签的一部分。当搜索带有candy
标签的食谱时,我不想获得candy cotton
(做作的示例)的点击量。
OR
查询使用以下方法,因为json_tree
实际上为JSON数组中的每个条目创建了“许多行”。
是否可以使用JSON1
扩展名?
答案 0 :(得分:0)
您可以使用LIKE
。利用以下事实:在JSON列中,每个标签都包含在"
中。
WHERE LIKE '%candy%'
将返回candy
和cotton candy
。
WHERE LIKE '%"candy"%'
将仅返回candy
。
尽管有嵌套功能,但您甚至不需要使用json_tree
,因为标签列表面上是TEXT。如果是嵌套的,则可以选择行
WHERE key = 'tags' and (value like '%"a tag"%' AND value like '%"another tag"%'