关于函数索引的Sqlite glob

时间:2016-03-13 11:57:20

标签: sqlite

使用最新的SQLite,我可以在文本字段的确定性函数上建立索引(例如MYFUNC(MyCol))。但每当我尝试对此进行全局搜索时,例如

select * from myTable where MYFUNC(MyCol) glob 'Z*'

它似乎没有使用索引,而是在表中的每一行上慢慢调用MYFUNC。根据{{​​3}},你不能在带有索引的glob表达式中使用重载的内置函数,但它并不能说你不能使用非重载自定义函数。这实际上是另一个限制,还是我做错了什么?

(这似乎是一件非常普遍的事情,例如,通过使用标准化字段格式的MYFUNC,允许在名称字段上搜索而不会对重音,前缀等敏感。)

1 个答案:

答案 0 :(得分:1)

您的自定义功能可能会使索引无效。即使它理论上没有,我也不会期望sqlite能够解决这个问题。

实际上,您链接的文档恰恰说明了这一点:

  

这种用途有很多条件:
  1. LIKE或GLOB运算符的左侧必须是具有TEXT亲和性的索引列的名称   2. [...]

因此,将任何函数应用于该列将阻止sqlite使用该索引。

执行您尝试做的事情的方法是在表格中添加一个额外的列:将其称为MyCol_clean或其他内容。确保在MyCol更改时更新它(您可以使用触发器执行此操作)。

添加新列(当然在那里创建索引),您可以有效地搜索您的表格,并且在查询期间根本不需要评估MYFUNC