2009-08-23 44 views
8

不同方向的列我有一個表中定義:ORDER BY在SQLite中

CREATE TABLE bar_table (
     _id INTEGER NOT NULL PRIMARY KEY, 
     index INTEGER NOT NULL DEFAULT '65535', 
     _date DATE 
    ) 

我的基本select語句是:

SELECT * FROM bar_table ORDER BY <your-clause-here> 

如何按索引升序排列我的選擇,和日期降序?即小指數在大指數之前出現。在兩個指標相同的情況下,較晚的日期是第一個。

該文件指向我COLLATion,但我不確定那是什麼。

回答

21

儘管我知道你已經有了自己的答案,但我認爲在這裏工作的細節是有意義的。

首先,order by子句按指定的列或表達式的順序排列。在這種情況下:

order by index asc, _date desc 

的排序由index最小到最大(asc結束),並然後_date最大到最小(desc結束)。雖然asc是默認值,但當我有多個相反方向的列時,我通常會包括它,就像您在此處所做的那樣。

您也可以在您的order by表達式:

order by case when index < 0 then 1 else 0 end desc, _date desc 

這將會把所有的負面index行的頂部,然後排序那些_date。在您的order by子句中使用表達式在某些情況下非常有效。

現在,你提到了collation,並且對於這是什麼有點困惑。整理是數據庫如何在字符串比較中處理大寫字母和重音。使用Captial-Sensitive整理,'abc' != 'ABC'。但是,使用Captial-Insensitive歸類,'abc' = 'ABC'

應該指出,整理是而不是一個字符集。這通常由數據類型決定(varchar == ASCII,nvarchar == Unicode)。整理確定了比較字符串的方式,而不是可以使用哪些字符集。

此外,排序對某些語言也很重要。鑑於拉丁語整理,你只需要擔心大小寫和重音,但丹麥整理,'aa' = 'å'。 因此,您可以看到排序規則在確定不同語言的排序和比較方面起着重要作用。

歸類在訂購時非常重要,因爲它確定如何根據不同的大小寫和重音來排序字符串。這就是爲什麼它不斷出現在您的搜索。整理是重要的,它甚至本週affected StackOverflow

:感謝Michael Madsen指出這個具體的例子。

+0

整理不僅僅是比較大寫字母和重音的問題,它是一般的字符排序,包括將常規字符序列等同於其他字符。例如,在丹麥語中,「aa」仍然是寫作「å」的有效方式,即使å是丹麥語字母表中的最後一個字母,所以使用丹麥語整理可以相應地對文本進行排序(考慮到預期語言,它通常是正確的,如果是像德國的亞琛那樣的情況,那麼計算機就不能自行決定,在這種情況下,aa明顯不被用作å)。 – 2009-08-23 23:48:37

+1

謝謝。我很確定我嘗試了'按索引asc,_date desc'命令的建議,但沒有成功。 – jamesh 2009-08-24 12:08:55

+0

@jamesh:真的嗎?你確定?因爲這幾乎適用於每個RDBMS。我唯一能想到的地方是,'_date'是'varchar'字段而不是'datetime'。也許你需要用反引號來封裝'index',比如'\'index \''。 – Eric 2009-08-24 12:11:44