【发布时间】:2014-04-02 13:12:27
【问题描述】:
假设我有一个表T 和字段f 的索引。我想根据一些整数myF 过滤f。如果整数为 0,我想要 f 为 null 的所有记录。一个可靠的写法是:
db.rawQuery("SELECT someField FROM T WHERE "
+ (myF == 0 ? "f IS NULL" : "f = ?"),
(myF == 0 ? new String[] {}, new String[] {String.valueOf(myF)}));
这有点不方便;特别是如果查询比这更复杂并且有额外的参数。所以我想我会写
db.rawQuery("SELECT someField FROM T WHERE IFNULL(f, 0) = ?",
new String[] {String.valueOf(myF)});
相反,它更简单、更易于阅读和更易于维护。¹
我的问题是:如果f 上有索引,SQLite 是否仍会使用该索引,还是会诉诸表扫描?我问是因为在后一种情况下我' m 不是比较字段和参数,而是比较 表达式 和参数,我不确定 SQLite 查询优化器有多“智能”。
¹ 请注意,数据库中没有带有f = 0 的记录。
【问题讨论】:
标签: android sql sqlite indexing