我一直在尝试让SQLite使用带有LIKE的索引,但无济于事。我试着整理了所有的案例,但还是没有结果。任何人都有任何关于如何让SQLite像命中指数一样的想法。提前谢谢你
DROP TABLE IF EXISTS "test";
DROP TABLE IF EXISTS "test2";
DROP TABLE IF EXISTS "test3";
create table test(name TEXT COLLATE NOCASE);
create table test2(name TEXT);
create table test3(name TEXT);
create index idx_test_name on test(name);
create index idx_test2_name on test2(name);
create index idx_test3_name on test3(name COLLATE NOCASE);
insert into test(name) values('dan');
insert into test2(name) values('dan');
insert into test3(name) values('dan');
--explain query plan select * from test where name like 'test%'
-- explain query plan select * from test2 where name like 'test%'
-- explain query plan select * from test3 where name like 'test%'
5条答案
按热度按时间ztyzrc3y1#
引用自SQLITE邮件列表(http://www.mail-archive.com/sqlite-users@sqlite.org/msg27760.html)
默认情况下,Like不区分大小写。要让它使用您的索引,您需要使索引不区分大小写:
在测试上创建索引TEST_NAME(名称COLLATE NOCASE);
或使类似区分大小写:
语法词大小写敏感类=1;
bxjv4tth2#
在SQLite 3.6.23.1中,使用
test
上的索引:在SQLite 3.7.15开发版本中,同时使用
test
和test3
的索引(test2
上的索引用于扫描,而不是搜索):因此,答案是更新SQLite。
ilmyapht3#
从文档中:
由LIKE或GLOB运算符组成的术语有时可用于约束索引。这种使用有很多条件:
qnakjoqk4#
我对
org.xerial/sqlite-jdbc "3.25.2"
也有同样的问题。简单的基于文本的索引不能与LIKE操作符一起使用。但是,如果我放入=
,就会使用索引。我的表架构:aamkag615#
ILike确实有效,它基于dbeaver(chinook.db)中包含的SQLite数据库,
这表明SQLite足够聪明,可以将类似于iCASE的函数转换为规则和。Unicode-字符可能会有问题。