我正在使用一个SQLite 3数据库,该数据库必须处理一个相当通用的关键字搜索,搜索几个(确切数目当前未知,但可能是2-5)字段中的给定术语。
举个例子,假设我们有一个包含addChild()
和Title
列的表格,有人会传递搜索字符串Content
,然后很容易将其分成三个搜索字词{在开始搜索之前{1}},'foo bar baz'
和foo
。
这一切似乎都很简单,直到生成查询。使用一些for循环来生成如下语句相对简单:
bar
并且通常这应该有效,但它似乎是一种非常重复的结构化查询方式,如果有足够的搜索条件和列来检查,则可以轻松实现大小的扩展。
所以我的问题是,是否有更简单的方法来构造这样的语句?
答案 0 :(得分:1)
为避免编写长查询,您还可以将搜索参数传递到temporary table并在另一个中使用它:
CREATE TEMPORARY TABLE search_terms(keyword text);
INSERT INTO search_terms VALUES ('foo');
INSERT INTO search_terms VALUES ('bar');
INSERT INTO search_terms VALUES ('baz');
SELECT DISTINCT T.title,T.content FROM table T INNER JOIN search_terms ST ON
T.title LIKE '%' || ST.keyword || '%'
OR T.content LIKE '%' || ST.keyword || '%';
答案 1 :(得分:0)
首先,您可以使用字符串连接稍微简化查询:
WHERE (Title || ' ' || Content) LIKE '%foo%' AND
(Title || ' ' || Content) LIKE '%bar%' AND
(Title || ' ' || Content) LIKE '%baz%'
由于字符串越长,字符串操作越多,性能可能会稍微差一些。但是,表达式更简单,无论如何性能都会很糟糕。
为什么呢?因为您尝试使用SQL原语复制全文搜索。 SQLite具有全文搜索扩展名(请参阅here);这些可能是实现你想要的更好的方法。