尝试使空值最后时如何使用索引?

时间:2015-10-04 00:55:28

标签: sql sqlite

我正在使用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值最后得到,而不需要每次都评估每一行?

2 个答案:

答案 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