2013-11-02 69 views
1

我有以下指標:SQLLite指數在查詢不能爲空

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

以下ORDER BY查詢的部分successfuly使用索引:

ORDER BY DateFirstAdded COLLATE NOCASE ASC LIMIT 100 

但下列情況沒有:

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

是否有可能使其工作,如果是這樣,它是一個新的索引我需要做,或查詢djustment?

由於

回答

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 
+0

您是否可以使用編碼聘請CL? – Shaun