使用最新的SQLite,我可以在文本字段的确定性函数上建立索引(例如MYFUNC(MyCol))。但每当我尝试对此进行全局搜索时,例如
select * from myTable where MYFUNC(MyCol) glob 'Z*'
它似乎没有使用索引,而是在表中的每一行上慢慢调用MYFUNC。根据{{3}},你不能在带有索引的glob表达式中使用重载的内置函数,但它并不能说你不能使用非重载自定义函数。这实际上是另一个限制,还是我做错了什么?
(这似乎是一件非常普遍的事情,例如,通过使用标准化字段格式的MYFUNC,允许在名称字段上搜索而不会对重音,前缀等敏感。)
答案 0 :(得分:1)
您的自定义功能可能会使索引无效。即使它理论上没有,我也不会期望sqlite能够解决这个问题。
实际上,您链接的文档恰恰说明了这一点:
这种用途有很多条件:
1. LIKE或GLOB运算符的左侧必须是具有TEXT亲和性的索引列的名称 2. [...]
因此,将任何函数应用于该列将阻止sqlite使用该索引。
执行您尝试做的事情的方法是在表格中添加一个额外的列:将其称为MyCol_clean
或其他内容。确保在MyCol
更改时更新它(您可以使用触发器执行此操作)。
添加新列(当然在那里创建索引),您可以有效地搜索您的表格,并且在查询期间根本不需要评估MYFUNC
。