我希望通过树路径从表中获取子树.
path列存储字符串,如:
foo/ foo/bar/ foo/bar/baz/
如果我尝试选择以某个路径开头的所有记录:
EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE "foo/%"
它告诉我表被扫描,即使路径列被索引:(
有什么方法可以使LIKE使用索引而不扫描表吗?
我找到了一种方法来实现我想要的闭包表,但它更难维护和写入非常慢……
为了能够在sqlite中使用LIKE索引,
>表列必须具有TEXT affinity,即具有TEXT或VARCHAR类型或类似的类型;和
>索引必须声明为COLLATE NOCASE(直接或因为该列已声明为COLLATE NOCASE):
> CREATE TABLE f(path TEXT); > CREATE INDEX fi ON f(path COLLATE NOCASE); > EXPLAIN QUERY PLAN SELECT * FROM f WHERE path LIKE 'foo/%'; 0|0|0|SEARCH TABLE f USING COVERING INDEX fi (path>? AND path<?)
可以使用case_sensitive_like PRAGMA删除第二个限制,但这会改变LIKE的行为.或者,可以使用区分大小写的比较,将LIKE’foo /%’替换为GLOB’foo / *’.