我面临一个我不确定如何处理的数据库(特别是 sqlite)查询。
我正在寻找所有名称属性是某些提供的常量的子字符串的元组。
例如,它是一个包含食品的数据库。如果常数是“Maranatha Natural Almond Butter 26oz Lightly Roasted”,我希望数据库中包含“Almond Butter”、“Maranatha Natural”等词的任何元组作为匹配项返回。
我真的不知道如何有效地解决这个问题,任何帮助都将不胜感激。
使用LIKE
,但反过来:
SELECT *
FROM mytable
WHERE 'Maranatha Natural Almond Butter 26oz Lightly Roasted' LIKE '%' || name || '%'
我建议您尝试全文搜索。在您的示例中,您不一定需要它,因为它LIKE
可能就足够了。但是,如果您只想匹配确切的单词(假设您搜索的单词set
可能不想setting
匹配)并且如果您想要匹配多个单词,无论它们出现在您的描述中的何处,FTS 都会非常有用。在使用它之前,请验证您的实现是否已使用它编译:
sqlite> pragma compile_options;
CURDIR
ENABLE_FTS3 <---- this one has to appear
ENABLE_RTREE
TEMP_STORE=1
THREADSAFE=0
假设您在 FTS 表中FoodItemsFTS
填充了您之前提到的食物项目:
sqlite> CREATE VIRTUAL TABLE FoodItemsFTS USING fts3();
sqlite>
sqlite> INSERT INTO FoodItemsFTS (docid, content)
VALUES (1, "Maranatha Natural Almond Butter 26oz Lightly Roasted");
sqlite> INSERT INTO FoodItemsFTS (docid, content)
VALUES (2, "Maranatha Natural Almond Butter 26oz");
sqlite>
sqlite> SELECT docid FROM FoodItemsFTS WHERE FoodItemsFTS MATCH 'Almond Roasted';
1
sqlite>