我正在使用sqlite3,我正在尝试检索由某些col1排序的所有行,其中包含最后的空值。截至目前,我正在使用这种查询:
select * from table order by row1 is null, row1 asc
由于我的表中有很多行,查询工作得很慢,所以我决定在表(row1)上创建一个索引。
创建索引后,它极大地提高了查询的速度,如:
select * from table order by row1 asc
然而,sqlite似乎并没有将该索引用于" col1的命令为null"查询类型。
为什么基于该索引的sqlite只能将具有空值的行移到末尾? 有没有什么办法可以让null值最后得到,而不需要每次都评估每一行?
答案 0 :(得分:0)
您可以在order by
中尝试条件。
select * from table
order by case when row1 is null then 1 else 0 end, row1
默认排序为ascending
。因此,上面的查询中省略了asc
。
答案 1 :(得分:0)
SQLite 3.8.12将支持索引中的表达式:
var isDownloaded = [NSURL : Bool] // singleton in appdelegate
if let url = NSURL(string: urlString) {
if isDownloaded[url] != nil && !isDownloaded[url]! {
if let data = try? NSData(contentsOfURL: url, options: []) {
let json = JSON(data: data)
isDownloaded.updateValue(true, forKey: url) //mark it back to false if you delete the data for some reason.
}
} else {
//get it from memory
}
}
在早期版本中,您可以将查询拆分为两个子查询,每个子查询都可以使用索引:
> CREATE TABLE t(x);
> CREATE INDEX tnx ON T(x IS NULL, x);
> EXPLAIN QUERY PLAN SELECT * FROM t ORDER BY x IS NULL, x;
0|0|0|SCAN TABLE t USING COVERING INDEX tnx