我有一个包含区分大小写文本的SQL表。现在我想搜索(不区分大小写)文字是否出现在文本中。当然,一种方法是只执行[...] text LIKE '% <word1> %' AND text LIKE '% <word2> %' ...
,但是因为它是LIKE '%
,所以它总是一个全表扫描,我不能使用我的索引。我的问题是:这能被优化吗?
我发现的一件事是instr(text, '<word1>') > 0
,但它区分大小写。我也在COLLATE NOCASE
上尝试过,但没有任何变化。这里唯一的方法是instr(lower(text), '<word1>')
,这也是由于lower(...)
不是那么好(所有的搜索词都是保证小写的btw)。
Here's一个不起作用的小例子:
CREATE TABLE T (c VARCHAR(10) COLLATE NOCASE);
INSERT INTO T (c) values ("A");
INSERT INTO T (c) values ("b");
CREATE INDEX CONTENT_TEXT ON T(c COLLATE NOCASE);
SELECT * FROM T WHERE instr(c, 'a') COLLATE NOCASE;
发布于 2019-12-30 19:35:18
在较大的字符串中非常有效地搜索大小写敏感的单词的一种方法是使用full text search extension。
示例:
sqlite> CREATE VIRTUAL TABLE test USING fts5(foo);
sqlite> INSERT INTO test(foo) VALUES ('the quick red fox jumped over the lazy brown dog');
sqlite> SELECT * FROM test WHERE test MATCH 'FOX';
foo
------------------------------------------------
the quick red fox jumped over the lazy brown dog
如果您的数据已经存在于表中,那么使用external content模式可能会节省一些空间。
发布于 2021-04-19 23:09:58
你不需要做任何花哨的事情,只需要像这样使用"lower“函数:
SELECT * FROM
Questions
WHERE
INSTR(lower(Text),lower('Text'))
https://stackoverflow.com/questions/59529314
复制相似问题