使用时的SQLite索引在查询不起作用时为null

时间:2013-11-02 05:01:32

标签: sqlite indexing

我有以下索引:

CREATE INDEX IF NOT EXISTS dateIdx ON table1 (DateFirstAdded COLLATE NOCASE)

查询的以下ORDER BY部分成功使用索引:

ORDER BY DateFirstAdded COLLATE NOCASE ASC LIMIT 100

但以下情况并非如此:

ORDER BY DateFirstAdded is null COLLATE NOCASE, DateFirstAdded COLLATE NOCASE ASC LIMIT 100

是否可以使其工作,如果是,是否需要进行新的索引或查询调整?

由于

1 个答案:

答案 0 :(得分:1)

在从表中读取记录后,不能使用索引加快的排序;使用它的唯一方法是逐步浏览索引条目,而查询正在从表中读取数据。

这意味着索引中条目的顺序必须与ORDER BY子句中指定的顺序完全相同。

在这种情况下,没有索引将DateFirstAdded IS NULL作为其第一列(并且SQLite不支持表达式索引);您的索引最后有NULL记录。 (请注意,IS NULL返回0或1,不需要排序规则。)

要最后返回NULL记录并仍然使用索引进行排序,您必须将查询拆分为复合查询,该查询分别返回非NULL和NULL记录;为了能够使用ORDER BY,你必须使用子查询:

SELECT *
FROM (SELECT *
      FROM table1
      WHERE DateFirstAdded IS NOT NULL         -- uses index
      ORDER BY DateFirstAdded COLLATE NOCASE)  -- implied by index scan
UNION ALL
SELECT *
FROM table1
WHERE DateFirstAdded IS NULL                   -- uses index
LIMIT 100