2009-08-23 56 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