3
比方說,我有一個表T
和f
的索引。我想基於myF
的某個整數對f
進行過濾。如果整數是0,我想要所有記錄f
是null
。一個可靠的方式寫這將是:使用IFNULL會阻止SQLite使用索引嗎?
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)});
代替,這是更簡單,更易於閱讀,更容易maintain.¹
我的問題是:如果在f
的索引,將SQLite的還是使用該索引或將訴諸表掃描?我在問,因爲在後一種情況下,我不比較字段和參數,而是表達式和一個參數,我不確定SQLite查詢優化器是多麼「聰明」。
¹請注意,有與數據庫中的f = 0
沒有記錄。